Laravel中如何使用PHP数组实现MySQL LIKE模糊查询?
Laravel中实现数组多值LIKE模糊查询的解决方案
我来帮你搞定这个Laravel查询过滤器里的数组多值模糊查询问题!先说说你遇到的问题根源:你之前写的whereIn('name', 'LIKE', "%(array)$name%")完全不符合Laravel查询构造器的语法,而且直接把数组变量拼到字符串里,触发了“Array to string conversion”的错误,这就是你看到报错的原因。whereIn的正确用法是接受字段名和值数组,不能和LIKE这样混用。
下面是修正后的完整实现方案:
1. 修正ModelFilters中的name方法
把你那个有问题的name方法替换成下面的代码(注意不要重复定义多个name方法,只保留这一个即可):
class ModelFilters extends QueryFilter { // 兼容单值/多值的LIKE模糊查询 public function name($names) { // 统一转换为数组,同时支持单个值和多个值的请求 $names = is_array($names) ? $names : [$names]; // 使用闭包包裹orWhere,确保这组模糊查询是独立的逻辑单元 return $this->builder->where(function ($query) use ($names) { foreach ($names as $name) { // 对每个数组元素添加LIKE匹配条件,用or连接 $query->orWhere('name', 'LIKE', "%{$name}%"); } }); } // 这里可以保留你其他的过滤方法,比如精确查询的其他字段方法 }
2. 代码说明
- 数组兼容处理:先把传入的
$names统一转成数组,这样不管前端传的是单个字符串(比如name=10)还是数组(比如name[]=10&name[]=8),都能正常处理。 - 闭包包裹条件:用
where闭包包裹所有orWhere,避免这些模糊查询条件和其他过滤字段的逻辑产生冲突,确保多值模糊查询是一组独立的条件。 - 循环构建LIKE条件:遍历数组中的每个值,为每个值添加一个
orWhere LIKE,实现“匹配任意一个关键词”的模糊查询效果。
3. 调用方式
当需要传递多个关键词进行模糊查询时,前端可以通过数组形式传参:
- GET请求示例:
/your-model-endpoint?name[]=10&name[]=8 - POST请求(JSON格式):
{ "name": ["10", "8"] }
这样你的QueryFilter基类会自动将Request中的name数组传递给name方法,执行正确的多值模糊查询。
内容的提问来源于stack exchange,提问作者Dmitry Malys




