我有以下型号:
问题:[标题,user_id]
回复:[正文,question_id,user_id]
用户:[名称]
如您所见,一个问题有很多答复,而答复属于用户。
我已经向问题模型添加了贡献者关系,该模型检索添加了答复(使用答复作为联接表)的所有用户: / p>
public function contributors()
{
return $this->belongsToMany(User::class, 'replies')->distinct('user_id');
}
我必须使用distinct()
来删除重复项,因为用户可能会在一个问题上发表很多答复,而且效果很好。
现在,当我这样做时会发生问题:
Question::withCount('contributors')->get()
它将忽略对distinct()
的呼叫,并向我提供添加了答复(包括重复项)的用户总数。
有什么主意我可以解决这个问题吗?
答案 0 :(得分:1)
从关系中删除distinct()
,并将withCount()
与原始表达式一起使用:
public function contributors()
{
return $this->belongsToMany(User::class, 'replies');
}
Question::withCount(['contributors' => function ($query) {
$query->select(DB::raw('count(distinct(user_id))'));
}])->get();
答案 1 :(得分:0)
您可以通过向withCount
方法添加回调来实现。
$questions = Question::withCount('contributors', function ($query) {
$query->distinct('user_id');
})->get()
答案 2 :(得分:0)
u也可以在此处使用变量进行区分
public function contributors()
{
return $this->belongsToMany(User::class, 'replies');
}
Question::withCount(['contributors' => function ($query) use ($var) {
$query->select(DB::raw('count(distinct(user_id))'));
}])->get();
答案 3 :(得分:0)
您需要继续在关系方法中使用distinct('user_id'),以使此类操作正常进行:
$question->contributors()->count();
$question->contributors->count();
$question->contributors()->get()->count();
否则,在某些情况下,您会得到不同的结果。