操作符与注意事项
alt=Laravel 中查询 JSON 字段的正确方式:-> 操作符与注意事项 decoding="async" title="Laravel 中查询 JSON 字段的正确方式:-> 操作符与注意事项" alt="Laravel 中查询 JSON 字段的正确方式:-> 操作符与注意事项" src="https://img.php.cn/upload/article/001/246/273/176904654617849.jpg" alt="Laravel 中查询 JSON 字段的正确方式:-> 操作符与注意事项"> 操作符与注意事项 ” />
laravel 原生支持对 mysql 5.7+、postgresql、sql server 2016 及启用 json1 扩展的 sqlite 查询 json 列,推荐使用 `info->id` 语法而非 `whereraw`,既安全又兼容 eloquent;手动拼接 sql 易引发注入与语法错误(如列名误判)。
在 Laravel 中查询 JSON 类型字段(如 MySQL 的 JSON 列),最简洁、安全且框架原生支持的方式是使用 -> 操作符。以你的 orders 表和 info jsON 字段为例,若需查找 info.id 等于 6 的订单,应直接写作:
$value = 6; $order = DB::table('orders') ->where('info->id', $value) ->first();
✅ 此写法由 laravel 底层自动转换为数据库原生 json 查询语法(如 mysql 中转为 JSON_EXTRACT(info, ‘$.id’) = ?),并使用参数绑定,完全避免 SQL 注入风险,也杜绝了你遇到的 Unknown column ‘6112’ 这类错误——该错误正是因 whereRaw(‘… = ‘.$value) 直接拼接未转义数值导致:当 $value 是数字时,MySQL 错误地将其解析为列名(尤其在某些上下文或驱动版本中),而非字面值。
⚠️ 注意事项:
- -> 语法要求数据库版本支持 JSON(如 MySQL ≥ 5.7),低版本需升级或改用 whereRaw + 手动绑定(见下文);
- 字段路径区分大小写(如 ‘info->ID’ ≠ ‘info->id’);
- 若 id 是嵌套结构(如 info.user.id),可写为 ‘info->user->id’(Laravel 8.0+ 支持多级 ->);
- 对 JSON 数组,可用 whereJsonContains(‘info->tags’, ‘shipped’) 判断是否包含某值;
- 查询数组长度?用 whereJsonLength(‘info->items’, ‘>’, 3)。
如因环境限制必须使用 whereRaw,请务必配合参数绑定,禁止字符串拼接:
// ✅ 正确:使用 ? 占位符 + 参数绑定 $order = DB::table('orders') ->whereRaw("JSON_EXTRACT(info, '$.id') = ?", [$value]) ->first(); // ❌ 错误:直接拼接,高危! ->whereRaw("JSON_EXTRACT(info, '$.id') = $value") // → 触发 'Unknown column' 错误
最后,若你使用 Eloquent 模型(如 Order::class),还可进一步封装为本地作用域(Local Scope)提升复用性:
// 在 Order 模型中 public function scopeWhereInfoId($query, $id) { return $query->where('info->id', $id); } // 使用 $order = Order::whereInfoId(6)->first();
综上,放弃 whereRaw 字符串拼接,拥抱 Laravel 原生的 -> JSON 查询语法——它更安全、更简洁、更可维护,且与框架生命周期(如事件、访问器、序列化)天然协同。