【问题标题】:Laravel Filter Items by relationships fieldLaravel 按关系字段过滤项目
【发布时间】: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 方面没有取得任何成功。请帮忙。

【问题讨论】:

    标签: laravel eloquent laravel-6


    【解决方案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')

    【讨论】:

    • 谢谢阿努拉特这工作。另外,感谢您的小代码修改。
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 2021-12-20
    • 2021-12-15
    • 2014-01-15
    • 2021-08-12
    • 2023-03-06
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多