如何在 Laravel Eloquent 中简洁查询多个枚举值?

发布时间 - 2026-01-03 00:00:00    点击率:

使用 `wherein()` 方法可替代冗长的链式 `orwhere()`,以一行代码高效查询字段值属于指定数组的多条记录,语义清晰、性能更优。

在 Laravel Eloquent 中,当需要查询某字段匹配多个离散值(如 category_type 等于 2、3 或 4)时,直接链式调用 orWhere() 不仅冗长,还容易因逻辑优先级引发意外结果——尤其在混用 where() 和 orWhere() 时,若未显式分组,SQL 的 AND/OR 优先级可能导致查询偏离预期。

你尝试的 $categories = Category::where('category_type',[2,3,4,5])->get() 实际执行的是等值匹配(即 WHERE category_type = [2,3,4,5]),而非“包含于数组”,因此数据库仅将整个数组视为单个标量值(部分驱动下可能隐式转为字符串或触发类型转换),最终只返回 category_type = 2 的记录——这是常见误区。

✅ 正确且最简方案是使用 whereIn():

$categories = Category::whereIn('category_type', [2, 3, 4])->get();

该语句生成标准 SQL:
SELECT * FROM categories WHERE category_type IN (2, 3, 4),语义准确、性能高效,且天然支持空数组(返回空集合,无 SQL 错误)。

⚠️ 注意事项:

  • whereIn() 要求第二个参数为索引数组或集合,不支持关联数组(键名会被忽略);
  • 若需动态构建条件(如从请求参数获取类型列表),建议先过滤非法值并确保数组非空,必要时配合 when() 避免空查询:
    $types = request('types', []);
    $categories = Category::when(!empty($types), function ($query) use ($types) {
        return $query->whereIn('category_type', $types);
    })->get();
  • 如需排除某些值,对应方法为 whereNotIn();
  • 对于超大数据集(如上万 ID),注意数据库对 IN 子句的长度限制,此时应考虑分批查询或改用 JOIN/临时表。

综上,whereIn() 是替代多个 orWhere() 的标准、安全、可读性极佳的解决方案,应作为多值匹配的首选。


# laravel  # go  # 大数据  # sql  # 关联数组  # select  # 字符串  # 类型转换  # 数据库  # 链式  # 多个  # 的是  # 这是  # 子句  # 第二个  # 不支持  # 而非  # 如需  # 极佳 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  如何生成腾讯云建站专用兑换码?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  香港服务器租用每月最低只需15元?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  网站制作大概多少钱一个,做一个平台网站大概多少钱?  详解MySQL数据库的安装与密码配置  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  新三国志曹操传主线渭水交兵攻略  Android滚轮选择时间控件使用详解  原生JS实现图片轮播切换效果  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  进行网站优化必须要坚持的四大原则  Laravel如何使用模型观察者?(Observer代码示例)  简单实现Android文件上传  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  奇安信“盘古石”团队突破 iOS 26.1 提权  HTML 中动态设置元素 name 属性的正确语法详解  Laravel如何自定义分页视图?(Pagination示例)  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  微信小程序 HTTPS报错整理常见问题及解决方案  JS碰撞运动实现方法详解  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  C语言设计一个闪闪的圣诞树  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  浅谈javascript alert和confirm的美化  C++时间戳转换成日期时间的步骤和示例代码  微信小程序 scroll-view组件实现列表页实例代码  Laravel怎么上传文件_Laravel图片上传及存储配置  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  千库网官网入口推荐 千库网设计创意平台入口  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  微信小程序 wx.uploadFile无法上传解决办法  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  javascript中闭包概念与用法深入理解  高防服务器如何保障网站安全无虞?  Laravel如何处理CORS跨域请求?(配置示例)  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像