Laravel 4中使用DB::select查询的where in条件

4

我有以下SQL查询:

SELECT summary_table.device_id, WEEKDAY(summary_table.day) as day, AVG(summary_table.shows) as avg_shows
    FROM (
         SELECT device_id, day, sum(shows) as shows
         FROM statistics
         GROUP BY device_id, day
    ) as summary_table
    WHERE device_id IN (1,2,3) // Just for example
    GROUP BY device_id, WEEKDAY(day)

我该如何在Laravel中执行这个操作?我将这个查询放在了DB::select函数中,但是我该如何将所有的id放在“WHERE device_id IN(?)”条件中呢?我尝试使用“array(implode(',', $var))”,但是它没有起作用。如果我的id是"13, 14",那我只能得到id = 13的结果。

所以问题是如何在“?”的位置上放置一个包含所有id的数组?


展示你尝试过的代码。 - Damodaran
3个回答

9
请查看这里的文档,向下滚动到“使用数组进行Where In”:

http://four.laravel.com/docs/queries

"whereIn" 方法需要一个数组作为参数,因此可以直接传入 $var,无需使用 implode 函数。"
->whereIn('device_id', $var)

我可以一起使用DB :: select('..') - > whereIn吗? - Victor
该页面上的文档是针对查询构建器而非手动 SQL 查询的。 - jszobody
我使用手动 SQL 查询。将该查询放入查询构建器似乎有点困难? - Victor
因为你的子查询?当然会有点棘手。你可以查看http://laravel.com/docs/queries#advanced-wheres,了解子查询如何与查询构建器一起使用。最终,我认为你要么使用查询构建器来利用正确的绑定,要么采用@Kasyx的答案并完全手动执行。 - jszobody
->whereIn('device_id', $var) 这将与 DB::table() 一起使用,而不是 DB::select()。 - vishal-mote

3

Laravel使用PDO库。不幸的是,与PDO绑定在WHERE IN上不起作用。您可以在这里阅读相关内容。

因此,您需要像这样将准备好的字符串放入查询中:

"(...)
    WHERE device_id IN (".array(implode(',', $var)).")
    (...)"

我考虑了一下,唯一的问题是如何防止 SQL 注入。我一直信任 Laravel 的函数,例如 ->where()。我应该循环遍历 $var 并将其转换为 int,例如 (int)$item,然后再放入 implode 中吗? - Victor
是的,您在SQL注入方面是正确的。您应将所有$var元素转换为整数。 - Kasyx
在我看来,转换的最佳选择是 intval:http://us1.php.net/intval - Kasyx

0
"(...)
    WHERE device_id IN (".implode(',', $var).")
    (...)"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接