[Laravel 5.3 新功能] 5. JSON 字段的 where () 和 update () 语法讲解
说明
此文章是 [Laravel 5.3 新功能] 系列的第五篇文章,JSON 字段的 where() 和 update() 语法讲解。
[Laravel 5.3 新功能] 系列完整文章列表请见:分享:[Laravel 5.3 新功能] 系列文章
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+ 数据库支持这一特性。
链接
- 来自:https://mattstauffer.co/blog/new-json-colu...
- MySql JSON Data Type:https://dev.mysql.com/doc/refman/5.7/en/js...
这个很给力。。。
刚上手学Laravel开发的时候就想过有没有这个功能,终于来了,太给力了~
可惜还在5.6
上星期升级到 MySQL 5.7,一堆坑
@jeffyer 有些什么坑
@jeffyer 求分享你踩到的坑
$table->json
5.1就支持的吧https://learnku.com/docs/laravel/5.1/migrations
如果是 text 类型的字段怎么办