如何在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
相关产品推荐
相关产品推荐

