我有$ posts集合实例,我不会只获得具有评论的帖子,而最新的一个评论则有5个以上的声誉。我的收藏实例与此类似
<<
我的代码是
[
[
'id' => 1,
'title' => 'Some title',
'comments' => [
[
'id' => 1,
'content' => 'some content',
'reputation' => 5
],
[
'id' => 2,
'content' => 'some content',
'reputation' => 6
],
...
],
],
...
]
但是我认为还有更多好的解决方案。
答案 0 :(得分:1)
我不确定您要去这里做什么,但是也许这对您有用吗?
bellow将检索评论至少为1且声誉为5或更高的帖子,并且其降序排列。
$posts = Post::whereHas('comments')->with(['comments'=>function($q){
$q->where('reputation', '>', 4);
$q->orderBy('id', 'desc');
}])->get();
注意:您必须在commments
模型中初始化Post
的关系
例如:
class Post extends Model
{
/**
* Get the comments for the blog post.
*/
public function comments()
{
return $this->hasMany('App\Comment');
}
}
答案 1 :(得分:0)
我在这里找到了更好的解决方案代码
$posts = $posts->filter(function ($post, $key) {
$comments = collect($post['comments']);
return $comments->pluck('reputation')->max() > 5;
});
答案 2 :(得分:0)
如果您想评论信誉超过5的评论,那么@Jesus Erwin Suarez的答案是正确的。
但是,如果您想在其他字段中查看该帖子的评论的声誉是否超过5,则可以使用该方法:
// this will add an extra column `has_reputed_comments` in rows
$posts = Post::selectRaw('*, IF(EXISTS(SELECT * FROM comments where comments.post_id = posts.id AND comments.reputation > 5 ORDER BY id DESC), 1, 0) as has_reputed_comments')->get();
已更新
要过滤评论中提到的集合,您可以执行以下操作:
// this will return filtered result by reputation greater than 5
$comments = $posts->comments->where('reputation', '>', 5);