3分钟短文:Laravel模型创建数据条目的2个语法糖

简介: 语法糖,真甜!

引言

经过之前章节对于路由,控制器等知识做了很多的储备,接着我们开始与数据库交互,摆脱繁复且难以维护的SQL操作,laravel提供了MVC的M模型功能。

img

本期我们开始讲模型中,如何插入新条目,或者更新既有条目。

代码时间

我们在构建一个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领域原创作者

相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
模型无关的局部解释(LIME)技术原理解析及多领域应用实践
在当前数据驱动的商业环境中,人工智能(AI)和机器学习(ML)已成为各行业决策的关键工具,但随之而来的是“黑盒”问题:模型内部机制难以理解,引发信任缺失、监管合规难题及伦理考量。LIME(局部可解释模型无关解释)应运而生,通过解析复杂模型的个别预测,提供清晰、可解释的结果。LIME由华盛顿大学的研究者于2016年提出,旨在解决AI模型的透明度问题。它具有模型无关性、直观解释和局部保真度等优点,在金融、医疗等领域广泛应用。LIME不仅帮助企业提升决策透明度,还促进了模型优化和监管合规,是实现可解释AI的重要工具。
79 9
|
5月前
|
机器学习/深度学习 算法 计算机视觉
完全让ChatGPT写一个风格迁移的例子,不改动任何代码
完全让ChatGPT写一个风格迁移的例子,不改动任何代码
49 1
|
4月前
|
Python
告别混乱!Python上下文管理器的自定义实践,让你的代码更加整洁有序
【7月更文挑战第6天】Python的上下文管理器通过`__enter__`和`__exit__`方法自动处理资源的获取与释放,如文件操作。使用with语句结合自定义类(如`FileManager`示例),能确保文件在使用后正确关闭,防止资源泄漏,提升代码整洁度和健壮性。自定义上下文管理器是代码模块化和错误处理的好实践。
32 0
算法入门几个有用的代码
算法入门几个有用的代码
|
索引 Python
什么叫做类比,为什么有些 Python 入门教程结构不合理?
什么叫做类比,为什么有些 Python 入门教程结构不合理?
128 0
|
设计模式 移动开发 前端开发
😲Review 实战经典:2 种封装风格,你偏爱哪种?
所以大家在后台管理系统项目中遇到的很多问题也都是相似的,代码很值得 review,本篇带来一例(真实)
|
存储 编译器 文件存储
C++语言中多文件组合方式之经典
C++语言中多文件组合方式之经典
233 0
|
JavaScript 前端开发 开发者
前端技术-抽取代码片段 | 学习笔记
简介:快速学习前端技术-抽取代码片段
122 0