网站首页 > 技术文章 正文
引言
经过之前章节对于路由,控制器等知识做了很多的储备,接着我们开始与数据库交互,摆脱繁复且难以维护的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 :-)
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者
猜你喜欢
- 2024-09-15 laravel 使用 mongodb(laravel 使用gmail邮箱发送验证码)
- 2024-09-15 Laravel的这10个用法,你都没用过吧
- 2024-09-15 PHP Laravel框架用户权限管理,按钮级别控制(详细)
- 2024-09-15 3分钟短文:太爽了,用Laravel写API接口
- 2024-09-15 Laravel5.8简明教程(laravel-admin)
- 2024-09-15 3分钟短文:Laravel请求对象方法极多,可不是花拳绣腿
- 2024-09-15 「php」从零学laravel框架(二):注册登录API
- 2024-09-15 Laravel 5中如何添加Form功能(laravel 伪静态)
- 2024-09-15 告别 $arr[0]: PHP 和 Laravel 中更优雅的数组处理方式
- 2024-09-15 Laravel + Serverless Framework 快速创建 CMS 内容管理系统
- 1512℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 556℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 504℃MySQL service启动脚本浅析(r12笔记第59天)
- 482℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 481℃启用MySQL查询缓存(mysql8.0查询缓存)
- 461℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 441℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 438℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)