Laravel Eloquent:通过eaged loaded model.property对结果进行排序,并对结果进行分页

时间:2017-07-31 14:01:21

标签: laravel pagination eloquent eager-loading

假设我有三个模型:PostCategoryTag

帖子belongsTo类别和类别hasMany发布。

manyToManyTag之间的Category关系。

我想按类别名称列出我的帖子并对结果进行分页。

Post::with('category','category.tags')
  ->orderBy('category.name') //this is the bogus line
  ->paginate(10);

但是这种语法不起作用。

我尝试的是this

Post::select('categories.*')
  ->join('categories','posts.category_id','=','categories.id')
  ->orderBy('categories.name)
  ->paginate(10);

但后来我失去了急切的加载数据。

如果我删除select()子句,那么我会得到垃圾数据categories.id覆盖posts.id。请参阅here

有没有优雅的方法来解决这个问题? 花了好几个小时之后我离迭代的帖子只有一步之遥,并且手动'将关系加载为:

foreach($posts as $post) {
  $post->load('category','category.tags');
}

甚至不确定这是否有不足之处,但它似乎并不合适。如果我错了,请纠正我。

最后一步更新:对分页结果的热切加载不会起作用,所以如果我走这条路,我将需要实施更加丑陋的修复。

1 个答案:

答案 0 :(得分:1)

您应该能够同时使用joinwith

Post::select('posts.*') // select the posts table fields here, not categories
->with('category','category.tags')
->join('categories','posts.category_id','=','categories.id')
->orderBy('categories.name)
->paginate(10);

请记住,with子句不会改变您的查询。只有在执行查询后,它才会收集n + 1个关系。

您的解决方法确实失去了急切的装载优势。但您也可以在集合/分页器(查询结果)上调用load(..),因此调用->paginate(10)->load('category','category.tags')等同于上面的查询。