Laravel 按关系字段过滤项目

Laravel Filter Items by relationships field

我有以下查询:

$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 方面没有取得任何成功。请帮忙。

尝试这样的事情:

$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);

希望对您有所帮助

only getting results for products that have a catagory setting of show_in_products set to 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 table $prods->whereHas(...)
中的约束 然后加载 categoryprods ->with('category').

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