Laravel有很多关系


Laravel hasMany relation count

在我的索引站点上有许多类别(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();