【问题标题】:Laravel 4 where in condition with DB::select queryLaravel 4 where 条件与 DB::select 查询
【发布时间】:2021-11-16 23:49:05
【问题描述】:

我有下一个 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))”,但它不起作用。如果我有像 "13, 14" 这样的 id,我只会得到 id = 13 的结果。

所以问题是如何放置而不是“?” id 数组?

【问题讨论】:

  • 显示你目前尝试过的代码

标签: php laravel


【解决方案1】:

查看此处的文档,向下滚动到“使用数组中的 Where In”:

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

whereIn方法接受一个数组,所以直接传入$var,不需要内爆。

->whereIn('device_id', $var)

【讨论】:

  • 我可以一起写 DB::select('..')->whereIn 吗?
  • 该页面上的文档用于查询构建器,而不是手动 sql 查询
  • 好吧,我使用手动 sql 查询。将该查询放入查询构建器中似乎有点困难?
  • 因为你的子查询?当然会有点棘手。您可以查看laravel.com/docs/queries#advanced-wheres 以了解子查询如何与查询构建器一起使用。最终,我认为您要么使用查询生成器来利用正确的绑定,要么使用@Kasyx 的答案并一直手动进行。
  • ->whereIn('device_id', $var) 这将适用。 DB::table() 不与 DB::select()。
【解决方案2】:

Laravel 正在使用 PDO 库。遗憾的是,与 PDO 的绑定不适用于 WHERE IN。你可以阅读它here.

所以你要做的就是把准备好的字符串放在你的查询中,如下所示:

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

【讨论】:

  • 我想过。唯一的麻烦是防止 SQL 注入。我一直信任 laravel 函数,例如 ->where()。我应该遍历 $var 并转换为 int 像 (int)$item 之前将它放入内爆?
  • 是的,你对 sql 注入危险是正确的。您应该将所有 $var 元素转换为整数。
  • 在我看来,转换的最佳选择是intvalus1.php.net/intval
【解决方案3】:
"(...)
    WHERE device_id IN (".implode(',', $var).")
    (...)"

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 2014-10-04
    • 2017-11-17
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多