我正在尝试在Laravel DB
中的原始WHERE IN
查询中绑定一个数组。
例如:
$arr = [1,2,3];
DB::select(DB::raw("select * from test1 WHERE id IN ? "), [$arr]);
由于某种原因,数组未被更改为以下查询:
select * from test1 WHERE id IN (1,2,3)
有人知道我能以某种方式做到这一点吗?
$arr = [1,2,3];
$placeholders = implode(",", array_fill(0, count($arr), '?'));
DB::select("select * from test1 WHERE id IN ($placeholders)", $arr);
这个例子:
在这个例子中,我创建了一个新的数组,并使用与原始数组长度相同数量的问号来填充它。然后我将新数组用逗号分隔拼接成字符串 "?,?,?, ..."。接下来,我将这个子字符串插入到圆括号操作符 "IN" 中间。最后,将原始数组作为 select 函数的第二个参数传递。结果是,在 "IN" 操作符中,每个数组元素都有自己的占位符。
在 Laravel 中尝试:
$arr = [1,2,3];
$result = DB::table('test1')->whereIn('id', $arr)->get();
dd($result);
并且使用这个作为你的原始查询:
$arr = [1,2,3];
$arr = join(",",$arr);
$result = DB::select(DB::raw("SELECT * FROM test1 WHERE id IN (".$arr.")"));
dd($result);
$arr = [1,2];
$arr = join(",",$arr);
$result = DB::select(DB::raw("SELECT * FROM test1 WHERE id IN (?,?)"),$arr);
dd($result);
它将适用于您。
或者
DB::table("test1")->whereIn('id', $arr)->get();
我稍微优化了@nilecrocodile的代码,这样我们就不需要构建数组并从中创建字符串。相反,我们将以这种方式创建占位符字符串:
$placeholders = substr(str_repeat(', ?', count($arr)), 2);
DB::select("select * from test1 WHERE id IN ($placeholders)", $arr);
或者 Eloquent:
$q= TestModel::where('id',$arr)->get();
尝试:
$array = [2,5,9,7,5];
$arrPos = [];
$arrBind = [];
foreach ($array as $pos => $id) {
$arrPos[] = ":id_{$pos}";
$arrBind["id_{$pos}"] = $id;
}
$sql =
" SELECT * FROM test1 WHERE id IN (".implode(', ', $arrPos).") ";
$rs = DB::select($sql, $arrBind);
DB::select(DB::raw("select * from test1 WHERE id IN ? "), $arr);
- er.irfankhan11