3分钟短文:Laravel模型创建数据条目的2个语法糖
引言
经过之前章节对于路由,控制器等知识做了很多的储备,接着我们开始与数据库交互,摆脱繁复且难以维护的SQL操作,laravel提供了MVC的M模型功能。
本期我们开始讲模型中,如何插入新条目,或者更新既有条目。
代码时间
我们在构建一个hello world页面的时候,已经介绍了如何使用laravel的命令行脚手架创建新的模型文件,以及通过迁移功能创建数据库表。这样就把数据操作衔接起来了。
一般地,使用面向对象的方式创建一条新的数据,可以这样来写:
$event = new Event;
$event->name = 'Coffee and Laravel';
$event->venue = 'The Mocha Factory';
$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 用于指定是否 ”超级管理员“,如果在程序内不小心使用数组或者其他方式对其进行了写入,将会造成比较大的麻烦。
我们可以在模型内将其 “保护” 起来:
class User extends Model
{
protected $guarded = ['is_admin'];
}
这样使用User模型写数据库的时候,就杜绝了该字段的写入。
新建 or 更新
接着介绍laravel模型的几个语法糖。一个常规的场景,比如在写入数据时,先判断数据库表内是否有该条记录,如果没有就创建,如何有则返回。
模型有一个语法糖方法 firstOrCreate,举一个例子:
$event = Event::firstOrCreate(['name' => 'Coffee and Laravel']);
上面的代码相当于下面的操作:
$event = Event::where('name', 'Coffee and Laravel')->first();
if (is_null($event)) {
$event = Event::create(['name' => 'Coffee and Laravel']);
}
返回的总是一个 Event 对象,所以如果想要接着操作其他属性,那就接着写好了:
$event->venue = 'Starclucks';
$event->save();
这就是第二条SQL操作了,都是即时生效的。
firstOrCreate 方法还接收第二个参数,用于指定第一个参数查询语句不成立时,创建数据条目时使用。代码如下:
$event = Event::firstOrCreate(['name' => 'Coffee and Laravel'], ['venue' => 'Starclucks', 'city' => 'Dublin']);
如果 name 字段已存在,就返回第一条数据;如果不存在,就是用第二个数组写入。
laravel还有一个方法 firstOrNew 用于不立即写入数据库,直到手动写入:
$event = Event::firstOrNew(['name' => 'Coffee and Laravel']);
$event->venue = 'Starclucks';
$event->save();
写在最后
本文通过一个简单的数据操作介绍了如何保护字段,手动指定允许字段。以及两个语法糖的使用细节。
Happy coding :-)
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Android实现拍照及图片裁剪(6.0以上权限处理及7.0以上文件管理)
- Android仿微信调用第三方地图应用导航(高德、百度、腾讯)
- Android数据共享 sharedPreferences 的使用方法
- Android NavigationBar问题处理的方法
- mac系统下载、安装、使用Java8教程
- React Native学习之Android的返回键BackAndroid详解
- Android动态添加view的方法示例
- Android开发之瀑布流控件的实现与使用方法示例
- Android自定义View绘制四位数随机码
- Anroid四大组件service之本地服务的示例代码
- Android使用Activity实现简单的可输入对话框
- ANDROID BottomNavigationBar底部导航栏的实现示例
- Android实现时间倒计时功能
- Android开发基于Drawable实现圆角矩形的方法
- Android开发中滑动分页功能实例详解