You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动