Laravel 中查询 JSON 字段的正确方式:-> 操作符与注意事项

Laravel 中查询 JSON 字段的正确方式:-> 操作符与注意事项”> 操作符与注意事项<br />
” /></p>
<p><a style=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,请务必配合参数绑定,禁止字符串拼接

千面数字人

千面数字人

千面 Avatar 系列:音频转换让静图随声动起来,动作模仿让动漫复刻真人动作,操作简单,满足多元创意需求。

下载

// ✅ 正确:使用 ? 占位符 + 参数绑定
$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 查询语法——它更安全、更简洁、更可维护,且与框架生命周期(如事件、访问器、序列化)天然协同。

https://www.php.cn/faq/2015526.html

发表回复

Your email address will not be published. Required fields are marked *