从hasManyThrough计算与急切加载(仅需要Count)

时间:2017-11-15 12:41:01

标签: laravel count eloquent has-many-through eager-loading

我只需要计数,不想每次为每一行检索结果或执行查询。这就是我想要急切加载的原因。

我有3张如下表:

Admins
    id

Posts
    id
    admin_id

Comments
    id
    user_id    //nullable (null if comment from admin)
    admin_id   //nullable (null if comment from user)
    news_id

现在我想要检索来自单个管理员的所有帖子,并且从这些帖子中查看所有评论,而不检索帖子的所有评论,只有评论的评论, 通过急切加载来避免n + 1查询问题;

在这里,我认为我们应该建立一个关系,以便像以下一样使用急切加载:

//admin model    
public function commentsCountRelation()
        {
            return $this->hasManyThrough(Comment::class, News::class, 'admin_id', 'news_id')
                ->selectRaw('news_id, count(*) as count')
                ->groupBy('news_id');

        }

- 在这里我使用了hasManyThrough关系,因为news_id不在Admins表中。

然后我应该创建一个属性,轻松访问计数,如:

public function getCommentsCountAttribute()
    {   
        return $this->commentsCountRelation->first()->count ?? 0;
    }

然后访问它:

$admin = Admin::with('commentsCountRelation')->findOrFail($id);
$admin->commentsCount;

但它总是返回null,为什么会这样?

以下适用于hasMany& belongsTo,我在其他模特上使用过它,如:

//relation
public function ordersCountRelation()
    {
        return $this->hasOne(Order::class)->selectRaw('user_id, count(*) as count')
            ->groupBy('user_id');

    }

//attribute
public function getOrdersCountAttribute()
    {
        return $this->ordersCountRelation->count ?? 0;
    }

//Then accessed like:
$user = User::with('ordersCountRelation')->find($id);
$user->ordersCount; //return only count

任何帮助都将受到高度赞赏

1 个答案:

答案 0 :(得分:2)

无需使用hasManyThrough 只需使用一些关系和withCount方法:

$admin->posts->withCount('comments')->get();

然后您可以使用:$comments_count

访问它