在 Laravel Eloquent 中获取和过滤关系

Fetching and filtering relations in Laravel Eloquent

我在 Eloquent 中有以下模型:组、线程、评论和用户。我想查找特定组中特定用户的所有评论。

这是我目前的做法:

$group->threads->each(function ($thread) use ($user_id)
{
  $user_comments = $thread->comments->filter(function ($comment) use ($user_id)
  {
    return $comment->owner_id == $id;
  });
});

这看起来非常丑陋,可能非常慢,我只想摆脱它。 Eloquent 中获取我的结果集的最快最优雅的方法是什么?

如果一个group hasMany threads,和一个thread hasMany comments,你可以添加另一个关系组:group hasMany [=15] =] 通过 threads.

上群:

public function comments() {
    return $this->hasManyThrough('Comment', 'Thread');
}

现在,您可以通过$group->comments;

获取群里的评论

从这里,您可以针对用户提出要求:

$user_comments = $group->comments()->where('owner_id', $user_id)->get();

如果需要,您可以将 where 提取到评论的范围内。

solution pointed me in the right direction. I cross posted my question to the laracasts Forum and got a lot of help from Jarek Tkaczyk 也经常访问此站点。

hasManyThrough() 对于 Group 模型是要走的路:

public function comments()
{
  return $this->hasManyThrough('ThreadComment', 'Thread');
}

不过有几点需要注意:

  1. 使用关系对象而不是集合($group->comments()NOT $group->comments
  2. 如果您使用 Laravel 的软删除,您不能只将 get() 更改为 delete(),因为您会收到列 [=] 的歧义错误18=]。你也不能给它加前缀,这就是 Eloquent 的工作方式。

如果你想删除特定组中特定用户的所有评论,你必须做一些不同的事情:

$commentsToDelete = $group->comments()
        ->where('threads_comments.owner_id', $id)
        ->select('threads_comments.id')
        ->lists('id');

ThreadComment::whereIn('id', $commentsToDelete)->delete();

您基本上是在第一个查询中获取所有相关 ID,然后在第二个查询中批量删除它们。