You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:23:16