Как сгруппировать один столбец и сосчитать другой столбец с условием в Laravel? - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть таблица для студентов со столбцом remarks, равным pass или fail, и столбцом class для определения их группы.

Теперь я хочу получить коллекцию, используя красноречивый, который выглядит так:

Select count(remarks) where 'remarks' equal to pass and   
count(remarks) where 'remarks' equal to fail  
GROUP BY class

То, что я пробовал до сих пор:

Student::where('remarks', 'pass')
        ->selectRaw('count(remarks) as passRemark')
        ->where('remarks', 'fail')
        ->selectRaw('count(remarks) as failRemark')
        ->groupBy('class')->get();

Кажется, что приведенный выше код не работает и ничего не возвращает, он работает при использовании 1 where предложение, которое я не собираюсь делать, и я попытался добавить еще один where, запрос прерывается.

Кто-нибудь может предложить лучший подход для этого?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

Чтобы сохранить это в Eloquent, я бы использовал встроенный метод Laravel withCount() и функцию закрытия для каждого типа счета.

Что-то вроде этого было бы моим предпочтением (теперь я успешно проверил это: каждый студент будет иметь счет для обоих):

Student::withCount(['remarks as passRemark' => function ($query) {
         $query->where('remarks', 'pass');
}, 'remarks as failRemark' => function ($query) {
         $query->where('remarks', 'fail');
}])->groupBy('class')->get();
2 голосов
/ 16 февраля 2020

Полагаю, вам следует попробовать этот запрос, используя DB::raw(), просто чтобы посмотреть, работает ли он или нет, затем вы можете переписать его с помощью встроенных методов из ORM.

SELECT SUM((CASE WHEN remarks = 'pass' THEN 1 ELSE 0 END)) AS passRemark,
       SUM((CASE WHEN remarks = 'fail' THEN 1 ELSE 0 END)) AS failRemark
GROUP BY class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...