Laravel如何按Comment表likes字段排序关联查询的comments数组?
实现按likes字段排序评论的几种方法
有几种可行的实现方式,根据你的需求选择即可:
1. 修改关联定义,默认排序
直接在Poll模型的comments关联方法里添加排序规则,这样每次获取该投票的评论都会自动按likes排序:
// Poll.php public function comments() { return $this->hasMany(Comment::class, 'poll_id')->orderBy('likes', 'desc'); // desc为降序,asc为升序,按需调整 }
之后你原来的控制器代码无需改动,$poll->comments就能直接得到排序后的评论集合。
2. 动态关联排序(单次生效)
如果不想修改默认关联行为,只想在当前请求中排序,可以用with方法的闭包指定规则:
// 控制器代码 $poll = Poll::with(['comments' => function($query) { $query->orderBy('likes', 'desc'); // 可切换asc/desc }])->find($id); return view('pages.poll', ['poll' => $poll, 'comments' => $poll->comments]);
这种方式仅对本次查询生效,不影响其他地方调用$poll->comments的结果。
3. 集合内存排序
如果已经获取了评论集合,也可以在PHP内存中对集合排序,适合数据量不大的场景:
// 控制器代码 $poll = Poll::find($id); // sortByDesc降序,sortBy升序,values()重置集合键名避免视图遍历异常 $comments = $poll->comments->sortByDesc('likes')->values(); return view('pages.poll', ['poll' => $poll, 'comments' => $comments]);
注意:前两种是数据库层面排序,效率更高,适合数据量大的场景;第三种是拉取所有评论到内存后再排序,数据量大时性能会受影响。
内容的提问来源于stack exchange,提问作者Guilherme Moreira
相关产品推荐
相关产品推荐

