在具有distinct()的关系上使用withCount()

时间:2019-05-05 17:45:25

标签: laravel laravel-5 eloquent

我有以下型号:

问题:[标题,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()的呼叫,并向我提供添加了答复(包括重复项)的用户总数。

有什么主意我可以解决这个问题吗?

4 个答案:

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

否则,在某些情况下,您会得到不同的结果。