2014-09-23 164 views
0

我試圖做一個左連接使用兩個表,我需要在第一個滿足條件和每個用戶的第二個表中的行的總數所有用戶ID和名稱。如果用戶在第二個表中沒有行,則它必須爲null或零。Laravel雄辯省略空值

這是我的雄辯的查詢。

$users->where('users.access_type', '=', 'type1')->orwhere('users.access_type', '=', 'type2') 
       ->leftJoin(DB::raw("(SELECT user_id, COUNT(*) as count FROM table2 WHERE date > '2014-09-17 16:30:04' GROUP BY user_id) temp_table"), function($leftJoin) { 
        $leftJoin->on('temp_table.user_id', '=', 'users.user_id'); 
       })->select(DB::raw('users.user_id, users.name, temp_table.count as count'))->orderBy('count')->get(); 

不返回與空計數值的用戶。相反,它返回的用戶數量最少。我打印了查詢日誌並複製了上述查詢的原始查詢,填充了值並執行。它完美的工作,並返回空條目的用戶。除了添加值之外,不對從查詢日誌獲取的查詢進行更改。複製下面的原始查詢。

select users.user_id, users.name, temp_table.count as count from `users` left join (SELECT user_id, COUNT(*) as count FROM table2 WHERE date > '2014-09-17 16:30:04' GROUP BY user_id) temp_table on `temp_table`.`user_id` = `users`.`user_id` where `users`.`access_type` = 'type1' or `users`.`access_type` = 'type2' order by `count` asc 

我試圖改變USER_ID欄的列名使用as user兩者。還嘗試使用IFNULL替換零值爲零。但仍然沒有去。請讓我知道我做錯了什麼。

回答

0

在您的Eloquent查詢中,您需要用...->get()替換上一個函數調用...->first(),以檢索所有結果而不是第一個結果。

+0

這並不重要。使用' - > first()',因爲我只需要返回第一個數組。無論如何,我已經更新了這個問題。 – 2014-09-23 09:10:49

+0

使用'first()'將只返回第一個查詢結果,這就解釋了爲什麼只有一個用戶,即具有最少計數的用戶,因爲你用'count'命令了結果。使用'get()'將返回查詢返回的所有用戶。它還解釋了爲什麼查詢在從查詢日誌中複製時起作用,因爲「first」由Laravel完成,並且不在數據庫查詢本身中。 – lowerends 2014-09-23 09:16:01

+0

「first()」或「get()」都不返回空值的條目。兩者都返回除null之外的最小值。爲此我需要一些幫助。不是爲了他們之間的差異。這些都是自我解釋。謝謝你的嘗試。 – 2014-09-23 10:27:22