操作符与注意事项
" />
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 查询语法——它更安全、更简洁、更可维护,且与框架生命周期(如事件、访问器、序列化)天然协同。










