Laravel中如何在DB::raw里使用WHERE NOT IN语句
在Laravel中正确使用DB::raw实现WHERE NOT IN语句
你的两段代码都无法正确生效,问题出在参数绑定的方式上:
- 第一段代码中,绑定的
"1,2,3"会被数据库视为单个字符串值,实际执行的是WHERE ID NOT IN ('1,2,3'),无法匹配多个ID。 - 第二段手动添加引号后,绑定的
"'1','2','3'"同样会被当作单个字符串,执行语句变为WHERE ID NOT IN ('\'1\',\'2\',\'3\''),依然不符合预期。
以下是两种正确的实现方式:
方法1:优先使用Laravel原生whereNotIn(推荐)
无需依赖DB::raw,Laravel查询构建器原生支持该语法,更安全且易维护:
$ids = [1, 2, 3]; // 针对查询构建器的写法 $result = DB::table('your_table_name') ->whereNotIn('ID', $ids) ->get(); // 如果是用DB::select的场景 $result = DB::select("SELECT * FROM your_table_name WHERE ID NOT IN (?)", [implode(',', $ids)]);
方法2:必须使用DB::raw时的正确写法
如果业务场景要求必须用DB::raw,需要将数组拆分为多个独立的绑定参数:
$ids = [1, 2, 3]; // 生成对应数量的占位符 $placeholders = implode(',', array_fill(0, count($ids), '?')); $result = DB::select(DB::raw("SELECT * FROM your_table_name WHERE ID NOT IN ($placeholders)"), $ids);
或者使用命名参数的方式:
$ids = [1, 2, 3]; $bindings = []; $placeholders = []; foreach ($ids as $index => $id) { $paramName = ":id_{$index}"; $placeholders[] = $paramName; $bindings[$paramName] = $id; } $placeholderStr = implode(',', $placeholders); $result = DB::select(DB::raw("SELECT * FROM your_table_name WHERE ID NOT IN ($placeholderStr)"), $bindings);
内容的提问来源于stack exchange,提问作者JonX
相关产品推荐
相关产品推荐

