我有一个东西课:
class Thing extends Eloquent
{
public function owner() {
return $this->belongsTo('Owner');
}
}
所有者类:
class Owner extends Eloquent
{
public function things() {
return $this->hasMany('Thing');
}
}
我正在获得这样的事物的某些属性所订购的事物的分页列表:
Thing::orderBy('thing_property')->paginate(20);
但我意识到我想获得由其所有者的财产订购的物品清单。有没有雄辩的方法来做到这一点?我尝试了很多不同的事情但没有成功。我应该包括一些我在我的问题中尝试过的东西,但是它们中有很多,其中大部分可能都是愚蠢的,我甚至不知道它们中的任何一个是否接近。最近的一个是:
Thing::with('owner')->orderBy('owner.owner_property')->paginate(20);
在那之后不工作并阅读更多关于它的内容,我发现这并不是应该如何使用'with()'。不幸的是,我无法找到任何关于我应该使用的内容。
答案 0 :(得分:2)
您需要加入所有者的表格。预先加载(with
)不会加入,但会为相关模型运行另一个查询。
$things = Thing::join('owners', 'owners.id', '=', 'things.owner_id')
->orderBy('owners.owner_property')
->get(['things.*']); // return only columns from things
如果您有Thing
行没有Owner
(owner_id = null),请使用leftJoin
代替join
。
答案 1 :(得分:0)
看起来你对Laravels Eloquent ORM有了很好的基本把握。
如果您希望things
根据其父owner
获得订单,我会建议以下内容:
$results = Owner::with('things')
->orderBy('owner_property', 'ASC')
->paginate(20);
或者,如果您想订购父owner
,然后订购子things
,您可以执行以下操作:
$results = Owner::with(array( 'things' =>
function($query){
$query->orderBy('things_property', 'DESC');
})
->orderBy('owner_property', 'ASC')
->paginate(20);