【问题标题】:Eloquent "super-eager" nested query possible?雄辩的“超级渴望”嵌套查询可能吗?
【发布时间】:2019-03-14 10:53:40
【问题描述】:

伙伴们, 我的第一篇文章,搜索并尝试不同的解决方案和方法 - 最后在这里结束询问。

我有一个包含多个相关表的数据库。客户有一个位置,该位置具有多个设置(生命周期,例如计划、构建、运行),并且每个设置都有不同的电路。基本上:

客户->位置->设置->电路

现在我想要一个包含设置和电路信息的位置列表,其中选择了电路的供应商。

我将如何用 eloquent 编写这个查询?这是我到目前为止所尝试的,但它似乎忽略了“供应商”条款......

$locations = Locations::with(
    ['settings' => function($query) use ($request)
        {
            $query->with(
                ['circuits' =>function($query2) use ($request)
                    {
                        $query2->where('supplier', $request->supplier);
                    }
                ]
            );                  
        }
    ])
    ->where('customer_id', $customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get(); 

我敢肯定,所有“hasMany”和“belongsTo”扩展都是可用的。 感谢阅读和回答 乌多斯基

更新:工作代码,基于 Enver 的提示:

$locations = Locations::with('settings')
    ->whereHas('settings.circuits', function($query) use ($request)
        {
            $query->where('supplier', $request->supplier);
        }
        )
    ->where('customer_id', $report->customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get();

HasManyThrough 方法也很顺利:

扩展 Locations 模型:

public function circuits()
{
    return $this->hasManyThrough('App\Circuits', '\App\Settings');
}

然后使用这个查询:

$locations = Locations::with('circuits')
    ->whereHas('circuits', function($query) use ($request)
        {
            $query->where('supplier', $request->supplier);
        }
    )
    ->where('customer_id', $report->customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get();

谢谢大家!

【问题讨论】:

  • 您是否尝试过使用 with('settings.circuts') 嵌套关系或定义 HasManyThrough 关系?
  • 谢谢哈文! - 测试了“with('settings.circuits') 方法,仍然得到相同的结果。HasManyThrough 仍有待测试。首先需要阅读文档。

标签: laravel eloquent eager-loading relation nested-queries


【解决方案1】:

您可以将嵌套关系查询与预加载一起使用。

例子:

$relation_sort = 'asc';
$nested_sort = 'desc';

$result = Model::with([
   'relation' => function($query) use($relation_sort){
      $query->orderBy('relation_column', $relation_sort);
   },
   'relation.nested' => function($query) use($nested_sort){
      $query->orderBy('nested_relation_column', $nested_sort);
   }
])->whereHas('relation', function($query){
    //Relation exists check.
    $query->where('price', '>', 100);
})->whereHas('relation.nested', function($query) use($search_param){
    //Nested Relation search.
    $query->where('search_column', 'LIKE', $search_param);
})->get();

【讨论】:

  • 感谢 Enver - 这有帮助!将根据您的提示使用工作代码更新上面的“问题”。
  • 不客气。如果您的问题得到解答,请标记。
猜你喜欢
  • 2020-05-10
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2019-04-02
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多