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(...)中的约束 然后加载categoryprods ->with('category')

顺便说一句,with('projects.workorders') 是多余的,因为您已经拥有 with('projects.workorders.tasks')

【讨论】:

谢谢阿努拉特这工作。另外,感谢您的小代码修改。

以上是关于Laravel 按关系字段过滤项目的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 关系过滤器按 company_id

Lumen/Laravel Eloquent - 按数据透视表中的属性过滤

如何在laravel中按类别过滤帖子?

Laravel 4.1 多对多关系和条件在哪里?

Laravel Eloquent 模型按局部列和关系模型列值排序

Laravel:高级搜索表单查询