Laravel中使用whereRaw结合IN子句查询报错求助
Laravel 查询参数绑定错误解决方案
错误原因
你遇到的HY093错误,核心原因是PDO不支持将数组直接绑定到单个命名参数。在whereRaw中写CATEGORIA IN (:Par2)时,:Par2被识别为单个参数,但你传入的是数组['x1','x2'],PDO无法解析这种绑定逻辑,导致参数数量不匹配。
解决方案
方案一:使用Laravel原生查询构建器(推荐)
直接拆分条件为where和whereIn,Laravel会自动处理参数绑定,避免手动拼接的风险:
$cats = ['x1', 'x2']; $result = Projecto::where('ESTADO', 'd1') ->whereIn('CATEGORIA', $cats) ->get();
方案二:手动处理whereRaw的数组绑定(仅当必须用whereRaw时)
需要为数组中的每个元素生成独立占位符,再绑定对应参数:
$cats = ['x1', 'x2']; // 生成与数组长度匹配的命名占位符 $placeholders = collect($cats)->map(fn($_, $index) => ":cat{$index}")->implode(', '); // 合并基础参数和数组参数 $params = array_merge( ['Par1' => 'd1'], collect($cats)->mapWithKeys(fn($value, $index) => ["cat{$index}" => $value])->toArray() ); // 执行查询 $result = Projecto::whereRaw("(ESTADO = :Par1 AND CATEGORIA IN ({$placeholders}))", $params)->get();
关于移除Par2仍报错的问题
如果移除Par2和第二个条件后错误依旧,建议:
- 确认代码已保存并重新运行,无旧代码残留
- 清除Laravel缓存:执行
php artisan cache:clear和php artisan config:clear命令 - 检查是否有其他复用相同查询逻辑的代码
内容的提问来源于stack exchange,提问作者user2889251
相关产品推荐
相关产品推荐

