首页 > 解决方案 > 雄辩,从嵌套关系查询中检索结果

问题描述

这是我的查询:

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

所以我需要运输资料 id 2,相关的“成本”模型及其相关的 id 为 2 的“方法”,以及方法的相关“区域”。

但我不知道如何得到结果。如果我尝试->get(),我会得到所有ShippingProfiles,如果尝试

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

那么我将如何检索结果呢?我只看到了“get”、“first”和“find”……还是查询有问题?

标签: laraveleloquent

解决方案


您当前的代码存在一些问题。首先你有一个语法错误:

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

第二个::应该是->

其次,当你这样做时,firstOrFail()你实际上是在执行查询并返回 aModel作为结果。因此,当您将其余部分链接到Model实例时,您可能会遇到错误。

但是,有几种方法可以实现您的目标。首先,尝试使用whereKeywhich 将 where 子句添加到针对主键的查询中(就像 usingfindOrFail所做的那样 - 但它不会立即执行查询并返回模型)并使用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);
}]);

推荐阅读