[Laravel 5.3 新功能] 5. JSON 字段的 where () 和 update () 语法讲解
12

说明

此文章是 [Laravel 5.3 新功能] 系列的第五篇文章,JSON 字段的 where() 和 update() 语法讲解。

[Laravel 5.3 新功能] 系列完整文章列表请见:https://laravel-china.org/topics/2638

JSON 存储类型

Laravel 从 5.0 版本开始就已支持 JSON 数据的转换,但这样做的目的只是为了方便数据处理。你的数据依然以 TEXT 类型存放在你的数据库里。不过 MySQL 从 5.7 版本起开始支持原生 JSON 数据类型,这将为我们的开发带来便捷, Laravel 5.3 也为基于 JSON 类型的数据查询和更新引入了新的语法。

假设我们有一个包含 JSON 类型字段的数据表:

...
class CreateContactsTable extends Migration
{
    public function up()
    {
        Schema::create('contacts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->json('meta');
            $table->timestamps();
        });
    }

我们假设每个 contacts 表单都包含一些基本信息,比如联系人姓名。但是另外的一些属性是非常灵活的,这些属性最好以 JSON 类型方式进行存储 —— 就像上文的 meta 字段。

where() 语法介绍

假定某个 contects 的表单信息如下:

{
    "id": 1,
    "name": "Monkey",
    "meta": {
        "wants_newsletter": true,
        "favorite_color": "red"
    }
}

现在我们想要获取所有 favorite_color 为 red 的用户,我们可以这么写:

$redLovers = DB::table('contacts')
    ->where('meta->favorite_color', 'red')
    ->get();

这段代码将会从 contacts 表中把 meta 字段的 favorite_color 属性值为 red 的所有数据读取出来。

update() 语法介绍

我想将上文的 Monkey 用户的 wants_newsletter 设置为 false,可以这样写:

DB::table('contacts')
    ->where('id', 1)
    ->update(['meta->wants_newsletter' => false]);

值得注意的是,在上文代码中,即使 wants_newsletter 键值在此之前不存在,现在也会被创建并设置为 false。

看到它的强大之处没?在 5.3 里我们可以基于 JSON 字段属性进行查询,可以更新 JSON 字段中的任一属性而无需考虑其是否存在。

注:目前仅有 MySQL 5.7+ 数据库支持这一特性。

链接

本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7
hareluya

这个很给力。。。

2年前

刚上手学Laravel开发的时候就想过有没有这个功能,终于来了,太给力了~

2年前

可惜还在5.6

2年前

上星期升级到 MySQL 5.7,一堆坑

2年前

@jeffyer 有些什么坑

2年前

@jeffyer 求分享你踩到的坑

2年前

$table->json 5.1就支持的吧 https://laravel.com/docs/5.1/migrations

2年前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!