Laravel Eloquent / DB通过外表和订单结果得到关系

时间:2017-10-19 13:57:07

标签: php laravel laravel-5 eloquent

Laravel 5.5 中,我有一个数据库设置,如下面的ERD图像。我更喜欢使用Eloquent而不是查询生成器,但我不确定它是否可以由Eloquent完成。

enter image description here

关系

  • 对象A - >对象B [一对一]
  • 对象B - >对象C [one - one]

如何执行以下操作:使用对象A启动查询。通过对象AI想要获取对象B,尽管对象BI想要获取相应的对象C.最后一件事这是必需的,结果将按对象B中的position列升序排序。

我自己尝试了什么:使用Eloquent获取对象A和B 的所有对象(这是按位置升序排序)。 B的Foreach对象寻找相应的对象C.但我知道这不是问题的最佳解决方案。

有任何建议吗?

5 个答案:

答案 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');
}