Использование withCount () для отношения, которое имеет Different () - PullRequest
1 голос
/ 05 мая 2019

У меня есть следующие модели:

Вопрос : [title, user_id]

Ответ : [body, question_id, user_id]

Пользователь : [имя]

Как видите, на вопрос имеется много ответов, и ответ принадлежит пользователю.

Я добавил отношение contributors к модели Question , которое извлекает всех пользователей, добавивших ответ (используя ответы в качестве таблицы объединения):

public function contributors() 
{
    return $this->belongsToMany(User::class, 'replies')->distinct('user_id');
}

Мне пришлось использовать distinct() для удаления дубликатов, потому что пользователь может опубликовать много ответов на один вопрос, и это прекрасно работает.

Теперь проблема возникает, когда я делаю:

Question::withCount('contributors')->get()

Он игнорирует вызов distinct() и дает мне общее количество пользователей, добавивших ответ (включая дубликаты).

Есть идеи, как это исправить?

Ответы [ 3 ]

1 голос
/ 05 мая 2019

Удалите 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();
0 голосов
/ 05 мая 2019

Вы также можете использовать переменную здесь для различия

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();
0 голосов
/ 05 мая 2019

Вы можете сделать это, добавив обратный вызов к методу withCount.

$questions = Question::withCount('contributors', function ($query) {
    $query->distinct('user_id');
})->get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...