2014-09-23 166 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