在 Laravel 5.5 中,我有一个数据库设置,如下面的ERD图像。我更喜欢使用Eloquent而不是查询生成器,但我不确定它是否可以由Eloquent完成。
关系
如何执行以下操作:使用对象A启动查询。通过对象AI想要获取对象B,尽管对象BI想要获取相应的对象C.最后一件事这是必需的,结果将按对象B中的position
列升序排序。
我自己尝试了什么:使用Eloquent获取对象A和B 的所有对象(这是按位置升序排序)。 B的Foreach对象寻找相应的对象C.但我知道这不是问题的最佳解决方案。
有任何建议吗?
答案 0 :(得分:1)
您应该可以通过热切加载来完成此操作。
类似的东西:
$result = $ObjectA->with(['ObjectB', 'ObjectB.ObjectC'])->get();
https://laravel.com/docs/5.5/eloquent-relationships#eager-loading
答案 1 :(得分:1)
我更新了Gerson以前的评论,我的编辑应该在审核之前可见,但这是我将如何做的:
$result = $ObjectA->with(['ObjectB', 'ObjectB.ObjectC'])->get();
答案 2 :(得分:0)
您可以使用Eloquent
$data['result'] = ObjectA::join('ObjectB','ObjectA.id','=','ObjectB.object_a_id')
->join('ObjectC','ObjectB.id','=','ObjectC.object_b_id')->get();
答案 3 :(得分:0)
这是我可能会尝试做的事情:
{{1}}
答案 4 :(得分:0)
在你们的帮助下,我找到了我能想到的最佳解决方案:
ObjectA::with(['ObjectB' => function($query){
$query->orderBy('position', 'asc');
},'ObjectB.ObjectC'])->get();
ObjectA模型
public function ObjectB()
{
return $this->hasMany('App\ObjectB');
}
ObjectB模型
public function ObjectC()
{
return $this->hasOne('App\ObjectC');
}