在DB :: raw laravel 5.4中的数组绑定中

MrC*_*sss 1 php database laravel laravel-5

我正在尝试WHERE IN在Laravel 中的原始查询中绑定数组DB

例:

$arr = [1,2,3];
DB::select(DB::raw("select * from test1 WHERE id IN ? "), [$arr]);
Run Code Online (Sandbox Code Playgroud)

由于某种原因,该数组未更改为以下查询:

select * from test1 WHERE id IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)

有人知道我是否可以这样做吗?

nil*_*ile 7

$arr = [1,2,3];
$placeholders = implode(",", array_fill(0, count($arr), '?'));

DB::select("select * from test1 WHERE id IN ($placeholders)", $arr);
Run Code Online (Sandbox Code Playgroud)

这个例子:

  1. 支持任意长度的数组
  2. 不包含循环
  3. 安全地传递参数

在此示例中,我用等于数组长度的问号数量填充一个新数组。然后我粘合新数组,用逗号分隔,并得到“?,?,?, ...”。然后我在括号运算符“IN”之间插入这个子字符串。我将项目数组本身作为选择函数的第二个参数传递。因此,元素数组的每个元素在“IN”运算符中都有自己的占位符。


gau*_*rav 6

在laravel中尝试:

$arr = [1,2,3];
$result = DB::table('test1')->whereIn('id', $arr)->get();
dd($result);
Run Code Online (Sandbox Code Playgroud)

并将此用于您的原始查询:

$arr = [1,2,3];
$arr = join(",",$arr);
$result =  DB::select(DB::raw("SELECT * FROM test1 WHERE id IN (".$arr.")"));
dd($result);
Run Code Online (Sandbox Code Playgroud)

为了防止sql注入,您可以使用下面提到的类似内容。

 $arr = [1,2];
 $arr = join(",",$arr);
 $result =  DB::select(DB::raw("SELECT * FROM test1 WHERE id IN (?,?)"),$arr);
 dd($result);
Run Code Online (Sandbox Code Playgroud)

它将为您工作。