首页 文章

Laravel有很多关系

提问于
浏览
0

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

  • 1

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

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

    Board.php:

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

    然后叫:

    $board->replies->count()
    

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

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

  • 1

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

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

    并使用此用途如下

    $board->repliesCount()
    

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

  • 0

    试试吧

    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();
    

相关问题