首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

引言

前几期我们通过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 :-)

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200908A0CCHV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券