
在 Laravel 8 中对数据库单列进行多值匹配搜索时,应使用 whereIn() 方法而非 where(),并直接传入请求中的字符串数组(如 ['DELHI', 'MAHARASHTRA']),避免嵌套数组导致查询失败。
在 laravel 8 中对数据库单列进行多值匹配搜索时,应使用 `wherein()` 方法而非 `where()`,并直接传入请求中的字符串数组(如 `['delhi', 'maharashtra']`,避免嵌套数组导致查询失败。
在构建多选搜索功能(如省份多选筛选)时,前端通常会提交一个包含多个字符串值的数组,例如:
// 假设 $request->state 返回: ['DELHI', 'MAHARASHTRA', 'KARNATAKA']
此时若错误地使用 where() 并将整个数组作为第二个参数传入(如 where('state', [$request->state])),Laravel 会将其解析为等值比较(state = ['DELHI', ...]),不仅语法不兼容 SQL,还会因类型不匹配导致无结果或报错。
✅ 正确做法是使用 whereIn() 方法,它专为「字段值是否存在于给定数组中」设计:
$data = tbl_company::query()
->whereIn('state', $request->state) // 直接传入原始数组,无需额外包装
->paginate(100);
? 关键要点:
-
whereIn('column', $array)要求$array是一维索引数组(如['A', 'B', 'C']),不能是二维或带键名的关联数组; - 若前端可能未选择任何选项(即
$request->state为null或空数组),建议增加安全判断,防止 SQL 错误:
$query = tbl_company::query();
if (!empty($request->state)) {
$query->whereIn('state', $request->state);
}
$data = $query->paginate(100);
⚠️ 注意:whereIn 对空数组([])会生成 WHERE column IN (),触发 SQL 错误(MySQL 报错 SQLSTATE[42000]: Syntax error)。因此务必校验非空。
此外,若需兼顾大小写敏感性或模糊匹配,可结合 when() 和 orWhere 构建更灵活逻辑,但针对标准精确多值匹配,whereIn 是最简洁、高效且符合 Eloquent 惯例的解决方案。











