假设我有三个模型:Post
,Category
和Tag
。
帖子belongsTo
类别和类别hasMany
发布。
manyToMany
与Tag
之间的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');
}
甚至不确定这是否有不足之处,但它似乎并不合适。如果我错了,请纠正我。
最后一步更新:对分页结果的热切加载不会起作用,所以如果我走这条路,我将需要实施更加丑陋的修复。
答案 0 :(得分:1)
您应该能够同时使用join
和with
。
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')
等同于上面的查询。