Lar*el中查询JSON数组列:实现whereIn式多条件匹配


laravel中查询json数组列:实现wherein式多条件匹配

本文详细介绍了如何在Lar*el中查询包含数组的JSONB列,以实现类似`whereIn`的多值匹配逻辑。针对`JSON_CONTAINS`在查询数组时默认要求所有元素都匹配的问题,文章提出了使用`whereJsonContains`和`orWhereJsonContains`方法组合的解决方案,并通过具体代码示例展示了如何灵活地匹配JSON数组中的任意一个或多个值,提升查询的精确性和效率。

理解JSON数组列查询的挑战

在现代Web应用开发中,将复杂数据结构存储为JSON或JSONB类型列已成为常见实践。例如,一个support_tags列可能存储一个简单的字符串数组,如["caring", "budgets", "careers_employment", "addictions"]。当需要查询这些列时,一个常见的需求是找到那些support_tags中包含给定列表中任意一个标签的服务,而不是要求包含所有标签。

直接使用数据库原生的JSON_CONTAINS函数(或Lar*el通过whereRaw调用的方式)配合一个完整的JSON数组进行查询时,往往会遇到不符合预期的结果。例如:

$categories = ["caring", "smoking"];
$services = \App\Models\Service::where("status", "accepted")
    ->whereRaw("JSON_CONTAINS(support_tags, '" . json_encode($categories) . "')")
    ->get();

这段代码的意图是查找support_tags中包含"caring"或"smoking"的服务。然而,JSON_CONTAINS函数在第二个参数是一个JSON数组时,默认行为是检查第一个参数(support_tags)是否完整包含第二个参数(["caring", "smoking"])作为其子集。这意味着,只有当support_tags同时包含"caring"和"smoking"这两个元素时,记录才会被匹配。这与我们期望的“只要包含其中任意一个就匹配”的whereIn行为大相径庭。

解决方案:利用whereJsonContains和orWhereJsonContains

Lar*el Eloquent 提供了专门用于查询JSON列的便捷方法,其中whereJsonContains()和orWhereJsonContains()是解决此类问题的关键。这些方法允许我们以更优雅、更安全的方式查询JSON列中的单个值,并结合Eloquent的查询构建器,实现复杂的逻辑。

基础用法

whereJsonContains('column', 'value')方法用于检查指定JSON列中是否包含某个特定的值。例如,要查找support_tags中包含"caring"的服务:

$services = \App\Models\Service::whereJsonContains('support_tags', 'caring')->get();

实现“任意匹配”逻辑

为了实现类似whereIn的“任意匹配”逻辑,我们需要组合多个whereJsonContains条件,并使用逻辑OR操作符。在Eloquent中,这通常通过在闭包函数中构建查询来实现,以确保OR条件被正确地分组。

假设我们要查找support_tags中包含"smoking"或"caring"的服务,并且这些服务状态为"accepted",可以这样构建查询:

标贝悦读AI配音 标贝悦读AI配音

在线文字转语音软件-专业的配音网站

标贝悦读AI配音 66 查看详情 标贝悦读AI配音
$services = \App\Models\Service::where("status", "accepted")
    ->where(function($query) {
        $query->whereJsonContains('support_tags', 'smoking')
              ->orWhereJsonContains('support_tags', 'caring');
    })
    ->get();

代码解析:

  1. ->where("status", "accepted"): 这是一个标准的where条件,用于过滤状态为"accepted"的服务。
  2. ->where(function($query) { ... }): 这是关键部分。它允许我们创建一个嵌套的查询条件组。在这个闭包内部,所有的条件都会被视为一个整体,并与外部的条件通过AND连接。
  3. $query->whereJsonContains('support_tags', 'smoking'): 在闭包内部,第一个条件是检查support_tags是否包含字符串"smoking"。
  4. ->orWhereJsonContains('support_tags', 'caring'): 紧接着,使用orWhereJsonContains来添加第二个条件,检查support_tags是否包含字符串"caring"。由于是在同一个闭包内,这两个条件之间是OR关系。

最终,这个查询会返回所有状态为"accepted",并且其support_tags列中包含"smoking"或"caring"(或两者都包含)的服务。

动态构建多条件查询

如果我们的匹配列表$categories是动态的,我们可以通过循环来构建这些orWhereJsonContains条件:

$categories = ["caring", "smoking", "budgets"]; // 假设这是一个动态的分类列表

$services = \App\Models\Service::where("status", "accepted")
    ->where(function($query) use ($categories) {
        foreach ($categories as $category) {
            $query->orWhereJsonContains('support_tags', $category);
        }
    })
    ->get();

说明:

  • 在闭包中使用use ($categories)将外部的$categories变量引入。
  • 循环遍历$categories数组,为每个分类动态地添加一个orWhereJsonContains条件。这样,无论$categories中有多少个元素,查询都能正确地匹配其中任意一个。

注意事项与性能考量

  1. 数据库兼容性: whereJsonContains方法依赖于底层数据库的JSON函数。MySQL 5.7+、PostgreSQL等现代关系型数据库都支持JSON类型和相关函数。请确保你的数据库版本符合要求。
  2. 安全性: 相较于手动拼接SQL的whereRaw,使用whereJsonContains方法更加安全,它会自动处理值的转义,有效防止SQL注入。
  3. 性能优化: 对于大型数据集和频繁的JSON列查询,考虑为JSONB列创建索引。在PostgreSQL中,可以使用GIN索引来加速对JSONB内部键值或数组元素的查询。例如:
    CREATE INDEX support_tags_gin_idx ON services USING GIN (support_tags);

    在MySQL中,可以通过创建虚拟列并为其添加索引来优化。

  4. 数据结构: 确保JSON列中的数据结构一致。本教程假设support_tags是一个简单的字符串数组。如果JSON结构更复杂(例如,对象数组),查询方法可能需要调整,例如使用whereJsonContains('column->path', 'value')。

总结

Lar*el的whereJsonContains和orWhereJsonContains方法为查询JSON数组列提供了强大而灵活的工具。通过将这些方法与Eloquent的闭包查询功能结合,我们可以轻松实现类似whereIn的多值匹配逻辑,即在JSON数组中查找包含给定列表中任意一个值的记录。这种方法不仅提高了代码的可读性和维护性,还通过Eloquent的抽象层确保了查询的安全性,是处理JSONB数组列查询的推荐实践。

以上就是Lar*el中查询JSON数组列:实现whereIn式多条件匹配的详细内容,更多请关注其它相关文章!


# 第二个  # 西宁网站建设详细流程  # 黄骅工业网站建设  # 上海旅游推广网站大全  # 淘宝营销推广教程  # 北辰区电商网站推广分类  # 湖北seo软件排名前十  # 网站推广工作描述  # 音频网站推广  # 网站优化如何被百度收录  # 郑磊简历网络SEO  # 这是一个  # 我们可以  # 多个  # 第一个  # 是一个  # mysql  # 多条  # 已有  # 管理系统  # 数据结构  # 字符串数组  # 防止sql注入  # 应用开发  # sql注入  # ai  # 工具  # app  # go  # json  # js  # laravel 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  J*aScript:从子元素中批量移除特定CSS类  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略  163邮箱登录入口官网 163.com邮箱登录入口  WooCommerce 购物车:始终显示所有交叉销售商品  search中maxlength属性用法解析  汽水音乐官网网页版入口 汽水音乐官网网页版在线入口  《海底捞》点外卖方法  优化 React onClick 事件处理:函数引用与箭头函数的对比  天堂漫画网页版在线阅读 天堂漫画手机版入口  美发店速赢秘籍  Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置  动漫之家观看全集库 动漫之家免费资源网地址  iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  《雷电模拟器》自动点击设置方法  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  创建快捷方式启动系统保护  126邮箱申请入口官网_126邮箱注册免费登录2025  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  C++ virtual析构函数作用_C++基类虚析构函数防止内存泄漏  yy漫画官方网站登录入口_yy漫画在线阅读页面地址  sublime如何处理超大文件不卡顿 _sublime打开大日志文件技巧  智学网成绩单查询系统网_智学网学生平台登录  b站网页版入口 哔哩哔哩官方网站直接进入  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理  优化2xN网格最大路径和的动态规划算法实践  CSS如何使用outline-offset与颜色组合突出元素边框  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  sublime如何自定义文件类型图标_AFileIcon插件的主题切换与个性化配置  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  C++ bind函数使用教程_C++参数绑定与函数适配器的应用  快手极速版在线体验区 快手极速版网页体验入口  byrutor直接访问入口 byrutor官方游戏库  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  Git命令与VS Code UI操作的对应关系解析  J*a实现任务清单管理_集合框架综合入门练手  使用Python和NLTK从文本中高效提取名词的实用教程  Go Template中优雅处理循环最后一项:自定义函数实践  德邦快递收费标准详解  Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析  蛙漫2(台版)正版官网 2025免费网页版分享  Python中深度嵌套字典与列表的数据提取与条件过滤指南  PPT智能排版生成入口 免费PPT内容自动生成平台  服装短视频如何起号推广?服装短视频起号推广有什么要求?  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法 

 2025-11-13

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

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

点击免费数据支持

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

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@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.