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

如何在Laravel中通过WHERE条件查询SQL中的JSON类型数据

我来帮你解决这个问题!在Laravel中查询嵌套JSON数组里的数据其实不难,尤其是你要找的是order->Product->user->id === 1的订单,下面几种方法都能实现:

方法1:使用Laravel自带的whereJsonContains(简洁直观)

因为你的order和Product都是数组结构,所以需要按照嵌套层级构造查询条件,Laravel的whereJsonContains会自动转换为对应的MySQL JSON查询语句:

$targetOrders = Order::whereJsonContains('order', [
    'Product' => [
        ['user' => ['id' => 1]]
    ]
])->get();

这个方法适用于Laravel 5.6及以上版本,写法简洁,不需要手动拼接JSON字符串。

方法2:用whereRaw结合原生MySQL JSON函数(灵活适配复杂场景)

如果需要更精确的控制,或者遇到一些特殊的JSON结构,可以直接调用MySQL的JSON_CONTAINS函数,通过whereRaw执行原生查询:

$targetOrders = Order::whereRaw('JSON_CONTAINS(`order`, ?)', [
    json_encode([
        'Product' => [
            ['user' => ['id' => 1]]
        ]
    ])
])->get();

这里用json_encode来自动生成合法的JSON条件字符串,避免手动写JSON时出现语法错误。

方法3:MySQL 8.0+专属的JSON路径查询

如果你使用的是MySQL 8.0及以上版本,还可以用JSON_SEARCH通过路径匹配来查询,适合不确定数组层级的场景:

$targetOrders = Order::whereRaw('JSON_SEARCH(`order`, "one", 1, null, "$**.user.id") IS NOT NULL')->get();

$**.user.id是JSON路径表达式,表示匹配任意层级下的user.id字段,只要该字段值为1就会被筛选出来。


注意事项:

  • 确保你的数据库字段类型是JSON(推荐)或者TEXT,且存储的是合法的JSON字符串;
  • 查询时的键名要和JSON结构里的完全一致(比如示例里的desription拼写不影响查询,但键名不能写错);
  • 替换代码中的Order为你实际的Eloquent模型类名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:17:49