Laravel有很多关系

我的索引站点上有许多类别(Category.php),它有许多Boards(Board.php) . 一个Board可以有很多主题(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;
}

回答(3)

3 years ago

找到了一个不错的方法即使如此,如果有人找到更好的方法,我会将这个问题保持开放 .

我声明了 hasManyThrough 关系,并且调用了count():

Board.php:

public function replies()
    {
        return $this->hasManyThrough(Reply::class, Topic::class);
    }

然后叫:

$board->replies->count()

执行了30个查询(之前45个) .

不过,我想找到一种加载数据的热切方式,将查询数量减少到2或3个查询 .

3 years ago

除了你的reply,你可以做这样的事情 .

public function repliesCount() {
        return $this->replies()->selectRaw('board_id, count(*) as aggregate')
                        ->groupBy('board_id');
    }

并使用此用途如下

$board->repliesCount()

请注意,您必须根据您的要求更改查询 .

3 years ago

试试吧

Change

$count = 0;
foreach ($this->topics()->withCount('replies')->get() as $topic) {
    $count += $topic->replies_count;
}

To

$topic_ids = $this -> topics -> pluck('id');
$reply_count = Reply::whereIn('id',$topic_ids) -> count();