
在 Laravel 8 中,需使用 whereIn() 方法而非 where() 来匹配数据库列中多个预设值,避免将数组误传为单值导致查询失败。
在 laravel 8 中,需使用 `wherein()` 方法而非 `where()` 来匹配数据库列中多个预设值,避免将数组误传为单值导致查询失败。
在构建多条件搜索功能(如多选下拉框)时,常需根据用户选择的多个状态(state)筛选记录。例如,前端提交了 ['DELHI', 'MAHARASHTRA', 'KARNATAKA'],目标是从 tbl_company 表中查出所有 state 字段匹配其中任一值的公司数据。
此时关键误区在于误用 where():
// ❌ 错误:$req->state 已是数组,再包一层 [] 会变成二维数组
$data = tbl_company::query()
->where('state', [$req->state]) // 等价于 where('state', [['DELHI','MAHARASHTRA','KARNATAKA']])
->paginate(100);
该写法实际向数据库发送 WHERE state = ?(单值比较),且参数为嵌套数组,不仅逻辑错误,还可能触发 SQL 绑定异常或始终无结果。
✅ 正确做法是使用 whereIn(),它专为「列值是否在给定数组中」设计:
// ✅ 正确:直接传入一维字符串数组
$data = tbl_company::query()
->whereIn('state', $req->state) // $req->state = ['DELHI','MAHARASHTRA','KARNATAKA']
->paginate(100);
此外,建议添加安全校验以提升健壮性:
// 可选:过滤空值并确保为数组
$states = is_array($req->state) ? array_filter($req->state) : [];
$data = $states
? tbl_company::query()->whereIn('state', $states)->paginate(100)
: tbl_company::query()->paginate(100); // 若未选任何状态,则返回全部
⚠️ 注意事项:
-
whereIn()要求第二个参数必须是一维索引数组(如['A','B','C']),不能是关联数组或嵌套结构; - 若
$req->state可能为null或非数组,务必提前判断,否则whereIn()会抛出InvalidArgumentException; - 数据库字段类型需与数组元素一致(如
state为VARCHAR,则数组中应为字符串,避免隐式类型转换问题); - 大量值(如上千项)时,
whereIn()性能可能下降,可考虑分批查询或改用JOIN/临时表方案。
掌握 whereIn() 是实现多选搜索的基础技能,正确使用可显著提升查询准确性和代码可维护性。











