У меня есть таблица со столбцом is_up_vote
= true|false
Я пытаюсь написать запрос, используя withCount()
, поэтому он возвращает мне сумму истинных и ложных значений.
select COUNT(is_up_vote) from comment_votes WHERE is_up_vote = true
возвращает 17
select COUNT(is_up_vote) from comment_votes WHERE is_up_vote = false
возвращает 15
Однако я не мог понять, как получить различные из них, поэтому итоговое значение возвращает 2.
То, что я пробовал, это:
Model::withCount(['votes' => function($q) {
$q->selectRaw(
'(SUM (COUNT(is_up_vote) WHERE is_up_vote = true) - (COUNT(is_up_vote) WHERE is_up_vote = false) )'
);
}]);
Но это возвращает 17 + 15 = 32
без SUM()
, это также возвращает 32.
$q->selectRaw(
'( (COUNT(is_up_vote) WHERE is_up_vote = true) - (COUNT(is_up_vote) WHERE is_up_vote = false) )'
);
Что я делаю что-то не так?
Редактировать :
Если я попробую одну сторону, она игнорирует где и все еще возвращает 32, поэтому не вызывается где (где это делает в sql)
return $query->withCount(['votes' => function($q) {
$q->selectRaw('(COUNT(is_up_vote) WHERE is_up_vote = true)');
}]);
запрос продолжения маунала возвращает 17:
select COUNT(is_up_vote) from comment_votes WHERE is_up_vote = true
Редактировать 2:
$query->withCount([
'votes as up_votes_count' => function($q) {
$q->where('is_up_vote', true);
},
'votes as down_votes_count' => function($q) {
$q->where('is_up_vote', false);
},
]);
Единственное, что я мог сделать, - это сделать это, но для получения общего результата потребовался бы дополнительный шаг, поэтому мне не очень понравился этот подход. Я уверен, что кто-то более опытный с запросами может придумать что-то с прямым запросом.