在 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');
}
不过有几点需要注意:
- 使用关系对象而不是集合(
$group->comments()
,NOT $group->comments
)
- 如果您使用 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,然后在第二个查询中批量删除它们。
我在 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 提取到评论的范围内。
hasManyThrough()
对于 Group
模型是要走的路:
public function comments()
{
return $this->hasManyThrough('ThreadComment', 'Thread');
}
不过有几点需要注意:
- 使用关系对象而不是集合(
$group->comments()
,NOT$group->comments
) - 如果您使用 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,然后在第二个查询中批量删除它们。