在我的索引站点上有许多类别(Category.php),其中有许多board (Board.php)。一个Board可以有多个Topic (Topic.php),一个Topic可以有多个reply (Reply.php)。
我想获取当前板的回复数,可能是急于加载。
我有一个方法,但是它执行了太多的查询。我创建了一个post_count属性,然后遍历每个主题并收集回复的数量。是否有办法从当前的董事会中选择所有的回复?
public function getPostCountAttribute()
{
$count = 0;
foreach ($this->topics()->withCount('replies')->get() as $topic) {
$count += $topic->replies_count;
}
return $count;
}
找到了一个好方法。尽管如此,如果有人找到更好的方法,我将把这个问题留到后面。
我声明了一个hasManyThrough
关系,并调用count():
Board.php:
public function replies()
{
return $this->hasManyThrough(Reply::class, Topic::class);
}
然后调用:
$board->replies->count()
执行了30次查询(之前为45次)。
仍然,我想找到一种热切的方式来加载数据,使查询数量减少到2或3查询。
除了你的回复,你还可以这样做。
public function repliesCount() {
return $this->replies()->selectRaw('board_id, count(*) as aggregate')
->groupBy('board_id');
}
和下面
的用法$board->repliesCount()
请注意,您必须根据您的需要更改查询。
试一试
$count = 0;
foreach ($this->topics()->withCount('replies')->get() as $topic) {
$count += $topic->replies_count;
}
$topic_ids = $this -> topics -> pluck('id');
$reply_count = Reply::whereIn('id',$topic_ids) -> count();