Laravel Eloquent - 如何使用ORM为远程相关模型添加Where条件?

时间:2017-05-09 18:11:37

标签: laravel laravel-5 eloquent laravel-5.2

我目前有以下内容:

Cars::with('cases')->with(['parts', 'parts.engines', 'parts.engines.metals'])
                   ->orderBy('car_name', 'DESC')->orderBy('id', 'DESC');

上面将列出我cars表中的所有行以及与每个汽车中的引擎相关联的金属。 metals表通过carsparts表与engines表相关。

我尝试过使用:

Cars::with('cases')->whereHas(['parts', 'parts.engines', 'parts.engines.metals'], function($query){
    $query->where('weight', '=', 45)
})->orderBy('car_name', 'DESC')->orderBy('id', 'DESC');

但是这个错误因为whereHas()不接受第一个参数的数组而且我没有看到一种方法来链接到与它的远距离关系。

如何使用内置ORM在metals表中的列上应用WHERE条件?

2 个答案:

答案 0 :(得分:2)

whereHas()只需要您要添加条件的关系的名称。因此,如果您尝试将条件添加到金属中,则只需限制parts.engines.metals关系。

另外,当您急切地加载嵌套关系时,您也不需要指定加载中间关系。也就是说,当您急切加载parts.engines时,您也不需要加载parts

因此,您的查询看起来像:

Cars::with(['cases', 'parts.engines.metals'])
    ->whereHas('parts.engines.metals', function($query) {
        $query->where('weight', '=', 45)
    })
    ->orderBy('car_name', 'DESC')
    ->orderBy('id', 'DESC');

此查询仅检索具有重量为45的相关金属的汽车。此外,对于那些被检索的汽车,它还会急切地加载与这些汽车相关的所有箱子,零件,发动机和金属。

答案 1 :(得分:-1)

我认为你的意思是:

Cars::with(['cases', 'parts', 'parts.engines', 'parts.engines.metals' => function($query){
$query->where('weight', '=', 45);
}])->orderBy('car_name', 'DESC')->orderBy('id', 'DESC');