引言
前几期我们通过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源创计划”,欢迎正在阅读的你也加入,一起分享。