Laravel Eloquent关联查询异常:排序后无法加载指定字段的Post数据
解决方案
这个问题的核心是查询构造器的链式调用顺序错误,咱们一步步来解决:
1. 修正查询顺序(关键!)
你当前的代码是先执行take($number)再orderBy('id', 'desc'),这会导致SQL先取出前$number条旧评论(默认按id升序),再对这几条进行倒序,完全不符合你"获取最新5条评论"的需求,同时还会干扰关联模型的加载逻辑。
正确的顺序应该是先排序,再取数量,调整后的代码如下:
Comment::with(['post:id,title']) ->orderBy('id', 'desc') ->take($number) ->get();
或者用Laravel提供的latest()方法简化排序逻辑(效果和orderBy('id', 'desc')完全一致):
Comment::with(['post:id,title']) ->latest('id') ->take($number) ->get();
2. 确认关联字段的正确性
你在with里指定post:id,title是正确的——Laravel关联加载时必须包含关联模型的主键字段(这里就是id),否则无法匹配评论表的post_id与帖子表的id,这一点你已经做对了。
为什么移除orderBy后能正常加载?
当你去掉orderBy时,Laravel默认会按评论的id升序取前$number条,这时候关联查询的逻辑是正常的;但加上错误顺序的orderBy后,查询结果的逻辑被打乱,导致关联匹配出现异常,所以加载不出Post数据。
内容的提问来源于stack exchange,提问作者Klick
相关产品推荐
相关产品推荐

