簡體   English   中英

根據多個不同的where條件查詢一個查詢來計算記錄?

[英]Query to count record with one query based on multiple and different where condition?

我的 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 分配給它們,然后嘗試使用這 3 個變量進行計數。

$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)。 所以我必須為所有 3 條記錄編寫完整查詢,我可以使用其他 function 來調用具有變量傳遞的完整查詢,但我有一種情況,我不能因為查詢中包含這么多其他過濾器,如果我創建新function 有這么多的變量傳遞代碼看起來很難看。

我相信問題是這樣的:

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

所有這些變量都引用同一個查詢 object。 現在這第一行將起作用:

$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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM