2014-09-23 5 views
0

Я пытаюсь сделать левое соединение, используя две таблицы, где мне нужно сначала получить идентификатор и имя пользователя, который удовлетворяет условию и общему количеству строк во второй таблице для каждого пользователя. Если у пользователя нет строки во второй таблице, она должна быть нулевой или нулевой.Laravel eloquent пропустил нулевые значения

Это мой красноречивый запрос.

$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 вам необходимо заменить последний вызов функции ...->first() на ...->get(), чтобы получить все результаты, а не только первый.

+0

это не имеет значения. Используется '-> first()', потому что мне нужно вернуть только первый массив. В любом случае, я обновил вопрос. –

+0

Использование 'first()' будет возвращать только первый результат запроса, что объясняет, почему вы получаете только одного пользователя, а именно, с наименьшим количеством, так как вы заказываете результаты по 'count'. Использование 'get()' вернет всех пользователей, возвращаемых запросом. Он также объясняет, почему запрос работает, когда вы копируете его из журнала запросов, поскольку «first» выполняется Laravel и не находится в самом запросе базы данных. – lowerends

+0

ни 'first()', ни 'get()' не возвращает запись с нулевым значением. Оба возвращают наименьшее значение, кроме null. для чего мне нужна помощь. а не разницу между ними. они самоочевидны. Спасибо за вашу попытку. –

Смежные вопросы