3分钟短文:Laravel模型写操作很简单,大多数人容易用错

Wesley13
• 阅读 411

引言

前几期我们通过laravel模型的读操作方法,实现了很多花样繁多的条件筛选查询, 可以说足以应对大多数的场景。

3分钟短文:Laravel模型写操作很简单,大多数人容易用错

本期说说写操作的那些事,包括创建,修改,这些直接操作数据库数据的操作方法。虽然简单,但是很多新手容易上来就犯错。

代码时间

先说说创建条目,数据库内原本不存在,直接新建一个条目的操作。我们仍然使用contacts表作为示例,下面是使用模型Contact新建一条数据:

     $contact = new Contact;$contact->name = 'Tom Hanks';$contact->email = 'tom@hanks.com';$contact->save();
 
    
    
    

创建一个空对象,然后对属性赋值,最后调用save方法将输入存档。一气呵成。

如果属性字段超级多,不是这么两三个,要手动一个一个赋值,想想都觉得恐怖。所以, 模型也提供了快捷的方法,接收一个数组,按照键值和属性的对应关系,一次写入:

     $contact = new Contact([    'name' => 'Tom Hanks',    'email' => 'tom@hanks.com']);$contact->save();
 
    
    
    

我们只是在实例化对象的时候,传入数组,用于调用 __constract() 方法。这样省却了很多代码空间。

但是,save方法太宽泛了,在创建数据时,用于写入数据库;在更新数据时,同样用于写操作。有点泛泛而谈的意思。框架贴心地准备了专门用于创建条目的 create 方法。看代码:

     $contact = Contact::create([    'name' => 'Tom Hanks',    'email' => 'tom@hanks.com']);
 
    
    
    

是不是代码上直观多了?

创建条目本身的逻辑没有太过复杂,我们接着看看更新操作,因为需要额外查询一次数据库,将存在的条目取出来, 然后对其数据重新操作,再更新到数据库,所以要绕多一些弯弯。

例如,将id=580的contact条目找出来,并更新其email地址,用代码实现是这样的:

     $contact = Contact::find(580);$contact->email = 'john@deway.com';$contact->save();
 
    
    
    

我们使用find根据id查找条目,并返回一个Contact模型对象。直接操作更新该对象的属性,最后调用save存档。这样就完成了数据库更新。

更直观地,可以使用框架的update方法,用于更新数据。传入的数组必须是数据库模型定义好的对应字段名。比如下面的例子,查找数据库内所有超过一年的contact,并标记状态:

     Contact::where('created_at', '<', Carbon::now()->subYear())->update(['status' => 'inactive']);
 
    
    
    

如果你不喜欢这样的操作,可以拆分为两步实现,类似下面这样:

     $contact = Contact::find(567);$contact->update(['status' => 'inactive']);
 
    
    
    

一条一条地更新数据是不现实的,一般情况下,都需要批量更新。举一个简单的例子, 从请求拿到数据,批量塞入数据库:

     public function update(Contact $contact, Request $request){    $contact->update($request->all());}
 
    
    
    

这样用的前提是你必须手动再模型中指定可以填充的字段名:

     protected $fillable = ['name', 'email'];
 
    
    
    

其他字段会自动过滤掉不会使用。或者使用相反的方式,字段太多,不能一一列举, 就使用保护字段,指定哪些不可填充:

     protected $guarded = ['id', 'created_at', 'updated_at', 'owner_id'];
 
    
    
    

如果你想要做更保险的字段指定,则可以使用request对象的only方法,指定哪些数据要使用, 其他的则直接废弃:

     Contact::create($request->only('name', 'email'));
 
    
    
    

有了这些基础的操作,终于可以说说更懒散的语法糖结构了。比如判断一个条目是否存在,如果存在则返回数据, 如果不存在则创建。

     $contact = Contact::firstOrCreate(['email' => 'walt@white.com']);
 
    
    
    

结果返回一个 Contact 模型。会根据 email 字段的值查找条目,如果没有则创建。

写在最后

本文主要讲解了通过模型创建数据条目,或更新条目。其中最关键的还是 模型字段的属性保护,指定可以写入的数据,并使用过滤器进行筛选。一般地,我们会使用验证器对数据做一个验证,通过后再视业务逻辑更新数据库。

Happy coding :-)

我是@程序员小助手,持续分享编程知识,欢迎关注。

本文分享自微信公众号 - 程序员小助手(mql45ea)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Laravel
​原文作者:TaylorOtwell(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Ftaylorotwell)网上偶得此书,是Laravel的作者写的。Laravel是近年来优秀的PHP框架,国内外都有很多支持者。该框架应用了大量PHP5
Wesley13 Wesley13
3年前
mysql 锁
第一章概述锁的分类:从对数据操作的粒度分表锁、行锁。从对数据的操作类型(读\\写)分读锁(共享锁)、写锁(排它锁)读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。写锁(排它锁):当前写操作没完成前,它会阻断其他写锁和读锁。第二章 表锁(偏读)偏向MyISAM存储引擎,开销小,加
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Wesley13 Wesley13
3年前
JAVA中 ReentrantReadWriteLock读写锁详系教程,包会
一、读写锁简介现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。 针对这种场景,JAVA的并发包提供了读写锁ReentrantReadW
Stella981 Stella981
3年前
ReentrantReadWriteLock读写锁详解
一、读写锁简介现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。 针对这种场景,JAVA的并发包提供了读写锁ReentrantReadW
Stella981 Stella981
3年前
Laravel处理session(会话)的方法详解
在Web应用程序中,有必要识别跨越请求的用户并为每个用户保存数据,为此,像Laravel这样的框架提供了一种称为会话的机制。本篇文章就来为大家介绍关于Laravel处理session(会话)的方法。!laravel(https://oscimg.oschina.net/oscnet/f7951cdc35af1b61cc4dd6bd63973e2924
Wesley13 Wesley13
3年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A
Wesley13 Wesley13
3年前
3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务
    在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了。    下面列举两种常用的场景:    一种是读写分离的数据源,例如一个读库和一个写库,读库负责各种查询操作,写库负责各种添加、修改、删除。    另一种是多个数据源之间并没有特别明显的操作,只是程序
Wesley13 Wesley13
3年前
3分钟短文:无私分享!Laravel模型使用2个小技巧
引言上一节我们详细讲解了模型的访问器功能,可以轻易扩展模型的属性访问,灵活又标准地增强了模型的读取数据的能力。!(https://oscimg.oschina.net/oscnet/8ad81dbd02bc49eab09d416614564cda.jpg)本文我们接着往下讲,说说模型的修改器,以及模型的职责