[英]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.