我的索引网站上有很多类别(Category.php),它有很多Boards(Board.php)。 董事会可以有很多主题(Topic.php),而主题可以有很多回复(Reply.php)。
我想获取当前电路板的回复数量,可能需要加载。
我有办法,但它执行的查询太多了。我创建了一个post_count属性,然后迭代每个主题并收集回复数量。有没有办法从当前的董事会中选择所有回复?
public function getPostCountAttribute()
{
$count = 0;
foreach ($this->topics()->withCount('replies')->get() as $topic) {
$count += $topic->replies_count;
}
return $count;
}
答案 0 :(得分:1)
找到了一个很好的方法。即使如此,如果有人找到更好的方法,我会把这个问题保持开放。
我声明了hasManyThrough
关系,并且调用了count():
Board.php:
public function replies()
{
return $this->hasManyThrough(Reply::class, Topic::class);
}
然后叫:
$board->replies->count()
执行了30个查询(之前45个)。
不过,我想找到一种加载数据的热切方式,将查询编号减少到2或3个查询。
答案 1 :(得分:1)
除了reply,您还可以执行此类操作。
public function repliesCount() {
return $this->replies()->selectRaw('board_id, count(*) as aggregate')
->groupBy('board_id');
}
并使用此用法
$board->repliesCount()
请注意,您必须根据自己更改查询。
答案 2 :(得分:0)
试一试
更改
$topic_ids = $this -> topics -> pluck('id');
$reply_count = Reply::whereIn('id',$topic_ids) -> count();
要强>
(-109) - 147