Запрос для подсчета записей с помощью одного запроса на основе нескольких и разных условий where? - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема с моим кодом подсчета laravel. Пожалуйста, проверьте код, чтобы подсчитать количество записей.

       /**
        *
        *These Are constants
        *Record::StatusVerified = 1
        *Record::StatusReject = 2
        *Record::StatusUnverified = 0
        *
        */
        $allCity = City::get();
        $rowData = [];
        foreach ($allCity as $val) {
            $content = [];
            $record  = Records::where(['city' => $val->id]);
       // other filters

            $statusVerified = $record->where(['status' => Record::StatusVerified])->count();
            $statusRejected = $record->where(['status' => Record::StatusReject])->count();
            $statusUnverified = $record->where(['status' => Record::StatusUnverified])->count();
            $content['verified'] = $statusVerified;
            $content['Rejected'] = $statusRejected;
            $content['Unverified'] = $statusUnverified;
            $rowData[] = $content;
        }

        //pur row to CSV file

В этом коде я пытаюсь получить количество записей на основе города и количества общей записи с условием статуса. Но только первый счет дает правильную запись, а другой дает нулевой (0) счет. Я пытаюсь поместить переменную $ record в другую переменную, а затем пытаюсь получить счет, но все та же проблема.

$newVariable = $record;
$content['verified'] = $newVariable->where(['status' => Record::StatusVerified])->count();
$content['Rejected'] = $newVariable->where(['status' => Record::StatusRejected])->count();
$content['Unverified'] = $newVariable->where(['status' => Record::StatusUnverified])->count();

Я даже создал 3 переменные $ Verified, $ unverified и $ rejected, а затем назначил переменную $ record для них затем попробуйте подсчитать с помощью этих трех переменных.

$verified = $unverified = $rejected = $record;
$content['verified'] = $verified->where(['status' => Record::StatusVerified])->count();
$content['Rejected'] = $rejected->where(['status' => Record::StatusRejected])->count();
$content['Unverified'] = $unverified->where(['status' => Record::StatusUnverified])->count();

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

1 Ответ

1 голос
/ 30 мая 2020

Я считаю, что проблема в следующем:

$verified = $unverified = $rejected = $record;

Все эти переменные относятся к одному и тому же объекту запроса. Теперь первая строка будет работать:

$content['verified'] = $verified->where(['status' => Record::StatusVerified])->count();

Однако во втором операторе:

$content['Rejected'] = $rejected->where(['status' => Record::StatusRejected])->count();

Это не работает, потому что $verified и $rejected относятся к одному и тому же запрос. $rejected добавьте еще одно условие к предыдущему запросу, и основной запрос будет примерно таким:

SELECT COUNT(id) FROM records
WHERE city = 'some_city_id'
AND status = 'verified'
AND status = 'rejected'

Теперь приведенный выше запрос явно возвращает ноль, потому что нет записей с обоими статусами.

На мой взгляд, лучший подход - просто использовать group by:

SELECT COUNT(id), status FROM records
GROUP BY status
WHERE city = 'some_city_id'
AND status in (‘verified', ‘rejected’, ‘unverified’)

Или «быстрый и грязный» подход (который я не рекомендую) - это клонировать исходный запрос:

$verified = clone $record;
$unverified = clone $record;
$rejected = clone $record;
$content['verified'] = $verified->where(['status' => Record::StatusVerified])->count();
$content['Rejected'] = $rejected->where(['status' => Record::StatusRejected])->count();
$content['Unverified'] = $unverified->where(['status' => Record::StatusUnverified])->count();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...