引言
前几期我们通过laravel模型的读操作方法,实现了很多花样繁多的条件筛选查询, 可以说足以应对大多数的场景。
本期说说写操作的那些事,包括创建,修改,这些直接操作数据库数据的操作方法。虽然简单,但是很多新手容易上来就犯错。
代码时间
先说说创建条目,数据库内原本不存在,直接新建一个条目的操作。我们仍然使用contacts表作为示例,下面是使用模型Contact新建一条数据:
创建一个空对象,然后对属性赋值,最后调用save方法将输入存档。一气呵成。
如果属性字段超级多,不是这么两三个,要手动一个一个赋值,想想都觉得恐怖。所以, 模型也提供了快捷的方法,接收一个数组,按照键值和属性的对应关系,一次写入:
我们只是在实例化对象的时候,传入数组,用于调用 __constract() 方法。这样省却了很多代码空间。
但是,save方法太宽泛了,在创建数据时,用于写入数据库;在更新数据时,同样用于写操作。有点泛泛而谈的意思。框架贴心地准备了专门用于创建条目的 create 方法。看代码:
是不是代码上直观多了?
创建条目本身的逻辑没有太过复杂,我们接着看看更新操作,因为需要额外查询一次数据库,将存在的条目取出来, 然后对其数据重新操作,再更新到数据库,所以要绕多一些弯弯。
例如,将id=580的contact条目找出来,并更新其email地址,用代码实现是这样的:
我们使用find根据id查找条目,并返回一个Contact模型对象。直接操作更新该对象的属性,最后调用save存档。这样就完成了数据库更新。
更直观地,可以使用框架的update方法,用于更新数据。传入的数组必须是数据库模型定义好的对应字段名。比如下面的例子,查找数据库内所有超过一年的contact,并标记状态:
Contact::where('created_at', '
如果你不喜欢这样的操作,可以拆分为两步实现,类似下面这样:
$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 模型。会根据 email 字段的值查找条目,如果没有则创建。
写在最后
本文主要讲解了通过模型创建数据条目,或更新条目。其中最关键的还是 模型字段的属性保护,指定可以写入的数据,并使用过滤器进行筛选。一般地,我们会使用验证器对数据做一个验证,通过后再视业务逻辑更新数据库。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货