Laravel 查询中 whereIn() 与 where() 的正确使用详解


在 laravel 中,`wherein()` 要求第二个参数必须是数组,而 `request('filename')` 返回的是字符串,直接传入会导致类型错误;应改用 `where()` 进行精确匹配,或对输入做数组转换后再使用 `wherein()`。

你遇到的错误:

Argument 1 passed to Illuminate\Database\Query\Builder::cleanBindings() must be of the type array, string given

根本原因在于这一行代码:

$media = $media->whereIn('med_name', request('fileName'));

whereIn('column', $array) 是为「列值是否存在于指定数组中」设计的,例如查找 med_name 为 'report.pdf' 或 'logo.png' 等多个可能值之一的记录。但 request('fileName')(来自 )返回的是一个字符串(如 "invoice"),而非数组 —— 因此 Laravel 底层校验失败,抛出类型异常。

✅ 正确做法取决于你的业务需求:

✅ 场景一:按文件名完全匹配(最常见)

用户在搜索框输入 invoice,你想查 med_name = 'invoice' 的记录:

if (request()->has('fileName') && trim(request('fileName')) !== '') {
    $media = $media->where('med_name', request('fileName'));
}
? 提示:使用 trim() 替代 != "" 更健壮,避免空格干扰。

✅ 场景二:支持模糊搜索(推荐体验)

用户输入 invo,应匹配 invoice.pdf、invo_2025.xlsx 等:

if (request()->has('fileName') && trim(request('fileName')) !== '') {
    $search = '%' . trim(request('fileName')) . '%';
    $media = $media->where('med_name', 'like', $search);
}

✅ 场景三:按多个文件名筛选(需修改前端)

若真需 whereIn(如多选文件名),则前端 应改为数组形式(如 name="fileName[]"),并确保后端接收为数组:


后端校验并安全使用:

$names = request('fileName', []);
if (is_array($names) && !empty($names)) {
    $media = $media->whereIn('med_name', $names);
}

⚠️ 额外建议:优化你的 select() 方法

当前代码存在两个潜在问题:

  1. N+1 查询风险:foreach ($media as ...) 内部又执行 MediaLibrary::where(...)->get(),每页 15 条就触发 15 次额外查询;
  2. 类型强制转换隐患:return ["files"=>(object) $files, ...] 将数组转为 stdClass,但在 Blade 中访问 $files[0]->path['full'] 易出错,建议保持数组结构或使用集合。

✅ 推荐重构内层查询为关联预加载(若模型已定义关系),或使用 groupBy + with() 一次性获取同组所有尺寸:

// 示例:按 med_group 分组聚合路径(需数据库支持 JSON_AGG 或 GROUP_CONCAT)
$mediaWithPaths = MediaLibrary::selectRaw('*, JSON_OBJECTAGG(med_dimension, med_path) as path_map')
    ->where('med_dimension', 'full')
    ->when(request('fileName'), fn($q) => $q->where('med_name', request('fileName')))
    ->when(request('mediaType'), fn($q) => $q->whereIn('med_extension', (array) request('mediaType')))
    ->groupBy('med_group')
    ->latest()
    ->paginate(15);

但更简单稳妥的方式是:先获取分页后的 full 记录,再用一次查询批量获取所有相关尺寸路径,然后在 PHP 层关联组装 —— 平衡可读性与性能。

✅ 总结

用法 适用场景 参数类型 示例
where('col', $value) 单值精确匹配 string / int where('med_name', 'report.pdf')
where('col', 'like', $pattern) 模糊匹配(推荐搜索) string where('med_name', 'like', '%report%')
whereIn('col', $array) 多值精确匹配 array whereIn('med_name', ['a.pdf','b.jpg'])

立即修复方案(对应你当前表单):
将 select() 方法中的错误行:

$media = $media->whereIn('med_name', request('fileName'));

替换为:

if (request()->has('fileName') && trim(request('fileName')) !== '') {
    $media = $media->where('med_name', 'like', '%' . trim(request('fileName')) . '%');
}

这样既解决报错,又提升用户体验 —— 用户无需输入完整文件名即可检索。


# php  # laravel  # js  # 前端  # json  # go  # 后端  # pdf  # String  # Array  # Object  # foreach  # select  # 字符串  # column  # input  # 重构  # 的是  # 多个  # 但在  # 你想  # 每页  # 第二个  # 分页  # 再用  # 报错 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11怎么关闭搜索历史 Win11清除搜索框最近记录【隐私】  Win11如何更改用户账户文件夹名称 Win11修改C:Users用户名【终极教程】  如何使用 Python 合并文件夹内多个 Excel 文件并避免权限错误  Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】  Win11怎么设置默认邮件应用_Windows11应用关联Mail设置  Windows 11怎么更改锁屏超时时间_Windows 11电源选项中设置屏幕关闭时间  LINUX怎么设置系统语言_LINUX修改中文环境  Mac如何备份到iCloud_Mac桌面与文稿文件夹云同步【设置】  Python字符串操作教程_切片拼接与格式化详解  Windows电脑如何截屏?(四种快捷方法)  如何使用Golang实现容器自动化运维_Golang Docker运维管理方法  Mac怎么安装软件_Mac安装dmg与pkg文件的区别【指南】  Win10如何卸载微软拼音输入法 Win10只保留一个输入法【教程】  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  php删除数据怎么清空表_truncate与delete区别及用法【汇总】  如何在 Go 中调用动态链接库(.so)中的函数  Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  windows如何测试网速_windows系统网络速度测试方法  Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】  Windows笔记本无法进入睡眠模式怎么办?(电源疑难解答)  c++中的可变参数模板(variadic templates)怎么用_c++模板编程黑魔法【C++11】  Win11怎么关闭开机声音_Win11系统启动提示音静音【教程】  Windows10如何更改桌面背景_Win10个性化幻灯片放映设置  c++如何实现多态性_c++ 虚函数表原理与动态绑定机制【教程】  Python 模块的 __name__ 属性如何由导入方式决定?  Win11怎么设置单手模式_Win11触控键盘布局调整教程【技巧】  如何使用Golang指针与结构体结合_修改结构体内部字段  Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】  Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】  如何在Golang中实现自定义Benchmark_Golang testing.B自定义性能测量示例  windows如何禁用驱动程序强制签名_windows高级启动设置指南  mac怎么安装pip_MAC Python pip安装工具与升级方法【详解】  c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】  如何在 Go 开发中正确处理本地包导入与远程模块路径的一致性问题  如何在包含多值的列中精准搜索指定演员?  Windows10无法识别USB设备描述符请求失败_通用串行总线控制器修复  Win11无法安装软件怎么办_Win11解除应用安装限制设置【修复】  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何解决同一段404代码在不同主机上表现不一致的问题  PHP主流架构怎么部署到Docker_容器化流程【操作】  c++ unordered_map怎么用 c++哈希表用法【教程】  Mac如何彻底清理浏览器缓存?(Safari与Chrome)  windows如何修改文件默认打开方式_windows设置程序关联教程  如何在 Django 中安全修改用户密码而不使会话失效  Win11怎么设置默认视频播放器_Windows 11关联媒体文件打开方式【步骤】  Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】  Windows10系统怎么查看系统版本_Win10运行winver命令查询  php做exe支持多线程吗_并发处理实现方式【详解】  php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】 

 2025-12-26

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.