Laravel 中使用 JSON Where 子句查询 JSON 数据

Laravel 中使用 JSON Where 子句查询 JSON 数据
最新回答
暗恋是最省钱的

2023-02-03 11:02:37

在 Laravel 中,可以使用 whereJsonContainswhere 方法配合 JSON 路径表达式来查询 JSON 类型的数据。以下是具体用法和注意事项:

1. 使用 whereJsonContains 进行包含查询

whereJsonContains 用于判断 JSON 字段是否包含指定的值,适用于查询 JSON 数组或对象中是否存在某个键值对。

  • 示例场景:假设有一个名为 meta 的 JSON 字段,存储格式为 {"form_id": 31},需要查询所有 form_id 为 31 的记录。
  • 代码实现
$formId = request()->id; // 从请求中获取 form_id$query->whereJsonContains('meta->form_id', $formId);
  • 说明

    meta->form_id 是 JSON 路径表达式,表示访问 meta 字段中的 form_id 键。

    第二个参数 $formId 会根据数据库类型自动处理,确保正确比较 JSON 数据。

2. 使用 where 进行精确匹配

where 方法配合 JSON 路径表达式,适用于完全匹配 JSON 字段中某个键的值。

  • 示例场景:查询 meta 字段中 form_id 精确等于 31 的记录。
  • 代码实现
$formId = request()->id; // 从请求中获取 form_id$query->where('meta->form_id', $formId);
  • 说明

    此方法生成 SQL 语句,直接匹配 meta->form_id 的值。

    适用于需要完全匹配键值对的情况。

3. 注意事项
  • 数据库支持

    确保数据库支持 JSON 数据类型和函数(如 MySQL 5.7+、PostgreSQL、SQLite)。

  • JSON 路径表达式

    语法需正确,例如 meta->form_id 表示访问 meta 的 form_id 键。

  • 数据类型一致性

    比较时确保类型一致。若 form_id 存储为整数,$formId 也应为整数,可用 intval() 转换。

  • 安全性

    若 $formId 来自用户输入,需验证和转义,防止 SQL 注入。

4. 方法选择建议
  • whereJsonContains:判断 JSON 字段是否包含某个值(如数组或对象中的键值对)。
  • where:精确匹配 JSON 字段中某个键的值。

掌握这两种方法,可高效处理 Laravel 项目中的 JSON 数据查询需求。