Laravel 原生支持对 MySQL 5.7+、PostgreSQL、SQL Server 2016 及启用 JSON1 扩展的 SQLite 查询 JSON 列,推荐使用 `info->id` 语法而非 `whereRaw" />
登录
首页 >  文章 >  php教程

Laravel查询JSON字段技巧与注意事项

时间:2026-02-09 08:28:09 149浏览 收藏

目前golang学习网上已经有很多关于文章的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《Laravel 查询 JSON 字段方法与注意事项》,也希望能帮助到大家,如果阅读完后真的对你学习文章有帮助,欢迎动动手指,评论留言并分享~

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

理论要掌握,实操不能落!以上关于《Laravel查询JSON字段技巧与注意事项》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>