You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.8中使用whereIn查询文件名时报错:Argument 1 passed必须为数组,传入字符串的问题排查与解决

问题分析与修复方案

让我帮你拆解下这个错误的原因,以及对应的解决办法:

问题根源

你碰到的这个错误,核心原因是**whereIn方法要求第二个参数必须是数组类型**,但你的request('fileName')是一个字符串——因为Blade里的文件名输入框是单个文本框,用户提交后传过来的是单个字符串值,直接塞给whereIn就触发了类型不匹配的报错。

看你仓库层的这段代码:

if (request()->has('fileName') && request('fileName') != "")
    $media = $media->whereIn('med_name', request('fileName'));

这里request('fileName')是用户输入的单个文件名字符串,而whereIn的设计是用来匹配字段值是否在一个数组范围内的(比如whereIn('id', [1,2,3])),所以必然会抛出must be of the type array, string given的错误。

修复方案

根据你当前的表单设计(单个文件名搜索框),最合理的修复有两种思路:

思路1:改用普通where替代whereIn

既然你要做的是单个文件名的匹配(精确或模糊),完全没必要用whereIn,直接用where方法就可以完美解决:

修改仓库层的代码:

if (request()->has('fileName') && trim(request('fileName')) != "") {
    $fileName = trim(request('fileName'));
    // 如果你需要精确匹配文件名
    $media = $media->where('med_name', $fileName);
    
    // 如果你需要模糊匹配(比如搜索包含关键词的文件名),可以换成like查询
    // $media = $media->where('med_name', 'like', "%{$fileName}%");
}

这个方案最贴合你当前的需求,代码改动最小,也最直观。

思路2:如果后续需要支持多文件名搜索(可选)

如果你之后想扩展功能,支持用户同时搜索多个文件名,那可以调整表单和后端代码:

  1. 先修改Blade里的输入框,把它改成数组类型:
<input type="text" class="form-control" name="fileName[]" placeholder="多个文件名用逗号分隔" value="{{ implode(',', request()->query('fileName', [])) }}">

(这里假设用户用逗号分隔多个文件名,你也可以换成标签选择器之类的交互)

  1. 然后修改仓库层的代码,处理数组参数:
if (request()->has('fileName') && !empty(request('fileName'))) {
    $fileNames = request('fileName');
    // 如果是单个输入框用逗号分隔的情况,需要把字符串转成数组并过滤空值
    if(is_string($fileNames)){
        $fileNames = array_filter(explode(',', $fileNames));
    }
    $media = $media->whereIn('med_name', $fileNames);
}

不过这个方案适合未来的扩展需求,如果你只是需要单个文件名搜索,思路1就足够了。

额外优化提示

  • 记得用trim()处理用户输入,避免空格或者空字符串导致的无效查询
  • 用模糊匹配like的时候,Laravel的查询构建器会自动处理参数绑定,不用担心SQL注入问题,放心用就好

内容的提问来源于stack exchange,提问作者Pouya Vaghefi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:24:09