Laravel 按关系字段过滤项目
Posted
技术标签:
【中文标题】Laravel 按关系字段过滤项目【英文标题】:Laravel Filter Items by relationships field 【发布时间】:2021-06-12 23:03:56 【问题描述】:我有以下疑问:
$job = Job::with('customer', 'location', 'projects.transactions', 'projects.workorders.tasks','projects.workorders', 'projects.prods.category')
->find($id);
我将如何只获取类别设置为 show_in_products 设置为 true 的产品的结果?该字段在projects.prods.category
中定义,我只想查看应该显示的产品。我在全局范围或whereHas
方面没有取得任何成功。请帮忙。
【问题讨论】:
【参考方案1】:试试这样的:
$job = Job::with('customer', 'location', 'projects.transactions', 'projects.workorders.tasks','projects.workorders', 'projects.prods', 'projects.prods.category')
whereHas('projects.prods.category', function($q)
$q->where('show_in_products', true);
)->find($id);
希望对你有帮助
【讨论】:
这正是我尝试过的,它给了我产品但没有类别现在它只是空的。如果有帮助,此类别关系是通过 hasOneThrough 关系实现的。 另外,对于那些被标记为 true 的对象,我确实得到了类别关系,而对于那些被标记为 false 的对象,我确实得到了 null。 添加 'projects.prods' 看看会发生什么,这个功能应该可以工作。【参考方案2】:仅获得类别设置为的产品的结果 show_in_products 设置为 true
假设您的产品在prods
关系中,那么您可以在with('projects.prods')
中过滤您的产品
$job = Job::with([
'customer',
'location',
'projects.transactions',
'projects.workorders.tasks',
'projects.workorders',
'projects.prods' => function($prods)
$prods->whereHas('category', function($category)
$category->where('show_in_products', true);
)
->with('category');
])
->find($id);
所以你过滤了projects.prods
的结果
通过category
表$prods->whereHas(...)
中的约束
然后加载category
和prods
->with('category')
。
顺便说一句,with('projects.workorders')
是多余的,因为您已经拥有 with('projects.workorders.tasks')
【讨论】:
谢谢阿努拉特这工作。另外,感谢您的小代码修改。以上是关于Laravel 按关系字段过滤项目的主要内容,如果未能解决你的问题,请参考以下文章
Lumen/Laravel Eloquent - 按数据透视表中的属性过滤