雄辩地,从嵌套关系查询中检索结果

时间:2018-06-19 21:38:30

标签: laravel eloquent

这是我的查询:

$profile = \App\ShippingProfile::findOrFail(2)
     ::with('costs')
     ->with( ['methods.zone' => function($query) {
      $query->where('id', 2);
   }])->get();

因此,我需要ID为2的运输配置文件ID 2(具有相关的“成本”模型)和ID为2的运输相关配置文件“方法”,以及方法的相关“区域”。

但是我不知道如何得到结果。如果我尝试->get(),则会得到全部运送配置文件,如果尝试

->first()我得到个人资料ID 1

那么我将如何检索结果?我只看过“ get”,“ first”和“ find” ...还是查询有问题?

1 个答案:

答案 0 :(得分:2)

您当前的代码存在一些问题。首先,您遇到语法错误:

$profile = \App\ShippingProfile::findOrFail(2)
    ::with('costs')

第二个::应该是->

第二,当您执行firstOrFail()时,实际上是在执行查询并返回Model作为结果。因此,当您将其余部分链接到Model实例上时,很可能最终会出错。

但是,有两种方法可以实现目标。首先,尝试使用whereKey,它会针对主键在查询中添加where子句(就像使用findOrFail一样-但它不会立即执行查询并返回模型),使用first()来获取预先加载了关系的模型实例:

$profile = \App\ShippingProfile::whereKey(2)
    ->with(['costs', 'method.zone' => function ($query) {
        $query->where('id', 2);
    }])
    ->first();

或者,如果您已经有模型的实例,则可以使用load(...),就像使用with(...)来加载关系一样:

$profile = App\ShippingProfile::findOrFail(2);

$profile->load(['costs', 'method.zone' => function ($query) {
    $query->where('id', 2);
}]);