2017-10-19 109 views
0

In Laravel 5.5我有一个类似于下面的ERD图像的数据库设置。我更喜欢在查询生成器上使用雄辩,但我不确定它可以通过Eloquent完成。Laravel Eloquent/DB通过外部表格和订单结果获取关系

enter image description here

关系

  • 对象A - >对象B [一个 - 一对多]
  • 对象B - >对象C [一个 - 酮]

如何ld我执行以下操作:使用对象A开始查询。通过对象AI想要获得对象B,并且虽然对象BI想获取相应的对象C.最后需要做的是将结果排序由position列对象B.

我已经试过自己升序:凭借口才得到对象A和B 的所有对象(这是上排序位置递增)。 B的Foreach对象寻找相应的对象C.但我知道这不是解决问题的最佳方案。

有没有建议吗?

+1

这是绝对有可能的,阅读了关于https://laravel.com/docs/5.5/eloquent-relationships为参考 – pseudoanime

+0

@pseudoanime感谢。我已经多次阅读该页面,但是您希望在该场景中使用哪部分文档? –

+0

看看页面中嵌套的热切加载。 $ results = ObjectA :: with('ObjectB.ObjectC) - > get();会给你所有的3个对象。那么这只是一个排序问题。 – pseudoanime

回答

0

有了你们的帮助,我来到了我能想到过最好的解决办法:

ObjectA::with(['ObjectB' => function($query){ 
    $query->orderBy('position', 'asc'); 
},'ObjectB.ObjectC'])->get(); 

对象A型号

public function ObjectB() 
{ 
    return $this->hasMany('App\ObjectB'); 
} 

ObjectB Model

public function ObjectC() 
{ 
    return $this->hasOne('App\ObjectC'); 
} 
0

你可以用雄辩

$data['result'] = ObjectA::join('ObjectB','ObjectA.id','=','ObjectB.object_a_id') 
->join('ObjectC','ObjectB.id','=','ObjectC.object_b_id')->get(); 
+0

感谢这个工程,但我注意到两件事:1.你忘了' - > orderBy('position','asc')'和2.我没有ObjectA的信息了。希望至少拥有来自其他对象的所有信息的objectA的id。我需要所有表中的所有字段,所以联接不会那么糟糕。 –

1

我更新由格尔森在以前的评论在那里进行审查之前,我的编辑应该是可见的,但在这里是如何我会这样做:

$result = $ObjectA->with(['ObjectB', 'ObjectB.ObjectC'])->get(); 
0

这是我可能会尝试做:

$ObjectA->with('ObjectB.ObjectC') 
    ->join('ObjectB','ObjectA.id','=','ObjectB.object_a_id') 
    ->orderBy('ObjectB.position','asc') 
    ->get();