Laravel有很多关系

时间:2016-08-23 15:03:43

标签: php laravel laravel-5 laravel-5.2

我的索引网站上有很多类别(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;
}

3 个答案:

答案 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