程序员小助手|3分钟短文:Laravel模型创建数据条目的2个语法糖

引言
经过之前章节对于路由 , 控制器等知识做了很多的储备 , 接着我们开始与数据库交互 , 摆脱繁复且难以维护的SQL操作 , laravel提供了MVC的M模型功能 。
程序员小助手|3分钟短文:Laravel模型创建数据条目的2个语法糖
文章图片
本期我们开始讲模型中 , 如何插入新条目 , 或者更新既有条目 。
代码时间
我们在构建一个helloworld页面的时候 , 已经介绍了如何使用laravel的命令行脚手架创建新的模型文件 , 以及通过迁移功能创建数据库表 。 这样就把数据操作衔接起来了 。
一般地 , 使用面向对象的方式创建一条新的数据 , 可以这样来写:
$event=newEvent;$event->name='CoffeeandLaravel';$event->venue='TheMochaFactory';$event->save();
大家注意 , 在对象创建之后 , 我们直接操作对象属性 , 为其赋值 , 最后调用save方法 , 就完成了数据新建的所有动作 。
我们在表中还有id字段 , created_at字段 , updated_at字段 , 并没有显式赋值 。 但是你打开数据库表查看结果的时候 , 发现那些值也成功的写入了 。
原有如下:
id字段是auto_increment约束 , 自动递增;
created_at/updated_at字段 , 在Event模型内使用了$timestamp=true 。 这样laravel在处理模型数据的时候 , 会默认更新此二字段 。
然而 , 对于写入数据库的那些数据 , 并不是所有字段都会允许写入的 。 在模型内我们可以手动指定哪些字段可以写 , 哪些字段不可以写 。 只需添加如下内容:
protected$fillable=['name','venue'];
这样就进允许指定的两个字段的值写入 , 其他都会舍弃 。
比如对于User模型 , 是控制用户权限资源的 , 所以非常重要 。 假如有一个字段is_admin用于指定是否”超级管理员“ , 如果在程序内不小心使用数组或者其他方式对其进行了写入 , 将会造成比较大的麻烦 。
我们可以在模型内将其“保护”起来:
classUserextendsModel{protected$guarded=['is_admin'];}
【程序员小助手|3分钟短文:Laravel模型创建数据条目的2个语法糖】这样使用User模型写数据库的时候 , 就杜绝了该字段的写入 。
新建or更新
接着介绍laravel模型的几个语法糖 。 一个常规的场景 , 比如在写入数据时 , 先判断数据库表内是否有该条记录 , 如果没有就创建 , 如何有则返回 。
模型有一个语法糖方法firstOrCreate , 举一个例子:
$event=Event::firstOrCreate(['name'=>'CoffeeandLaravel']);
上面的代码相当于下面的操作:
$event=Event::where('name','CoffeeandLaravel')->first();if(is_null($event)){$event=Event::create(['name'=>'CoffeeandLaravel']);}
返回的总是一个Event对象 , 所以如果想要接着操作其他属性 , 那就接着写好了:
$event->venue='Starclucks';$event->save();
这就是第二条SQL操作了 , 都是即时生效的 。
firstOrCreate方法还接收第二个参数 , 用于指定第一个参数查询语句不成立时 , 创建数据条目时使用 。 代码如下:
$event=Event::firstOrCreate(['name'=>'CoffeeandLaravel'],['venue'=>'Starclucks','city'=>'Dublin']);
如果name字段已存在 , 就返回第一条数据;如果不存在 , 就是用第二个数组写入 。
laravel还有一个方法firstOrNew用于不立即写入数据库 , 直到手动写入:
$event=Event::firstOrNew(['name'=>'CoffeeandLaravel']);$event->venue='Starclucks';$event->save();
写在最后
本文通过一个简单的数据操作介绍了如何保护字段 , 手动指定允许字段 。 以及两个语法糖的使用细节 。