我有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
任何帮助都将受到高度赞赏
答案 0 :(得分:2)
无需使用hasManyThrough
只需使用一些关系和withCount
方法:
$admin->posts->withCount('comments')->get();
然后您可以使用:$comments_count