php firstorfail,Laravel中firstOrCreate与firstOrNew及firstOrFail的区别

官方文档:

https://learnku.com/docs/laravel/6.x/eloquent/5176#b438f8

在日常开发的过程中,经常会遇到判断一条记录是否存在、存在更新、不存在新建记录这种场景,在 Laravel 中提供了方法支持,那么下面就看下具体的方法;

使用时请注意版本,下面介绍的函数 firstOrCreate 和 firstOrNew firstOrFail中使用

1、firstOrCreate

如果查询结果不存在,则会以后边的两个参数为基础,创建新的实例Model返回,并且将数据查询到数据中小于 5.5 版本,只有一个参数

public function firstOrCreate(array $attributes)

{

if (! is_null($instance = $this->where($attributes)->first())) {

return $instance;

}

$instance = $this->model->newInstance($attributes);

$instance->save();

return $instance;

}

5.5 版本

public function firstOrCreate(array $attributes, array $values = [])

{

// 判断是否存在,如果存在,返回实例

if (! is_null($instance = $this->where($attributes)->first())) {

return $instance;

}

// 不存在创建,此代码简化就是 $this->newModelInstance($attributes + $values)->save();

return tap($this->newModelInstance($attributes + $values), function ($instance) {

$instance->save();

});

}

2、firstOrNew

如果查询的结果不存在,则会以 firstOrNew中传递的两个参数为基础,创建一个新的Model 实例返回,并不会保存到数据库中

小于 5.5 版本,只有一个参数

public function firstOrNew(array $attributes)

{

if (! is_null($instance = $this->where($attributes)->first())) {

return $instance;

}

return $this->model->newInstance($attributes);

}

5.5 版本

public function firstOrNew(array $attributes, array $values = [])

{

if (! is_null($instance = $this->where($attributes)->first())) {

return $instance;

}

return $this->newModelInstance($attributes + $values);

}

查看源码就更清楚 firstOrCreate 比 firstOrNew 多了 save 方法,两个方法都很实用,根据场景使用它。

2.firstOrNew

会尝试使用指定的属性在数据库中寻找符合的纪录。如果未被找到,将会返回一个新的模型实例。请注意 firstOrnew 返回的模型还尚未保存到数据库。你需要通过手动调用 save 方法来保存它

用法:

User::firstOrNew(['name' => 'Lisi']);

User::firstOrNew(['name' => 'Lisi'], ['age' => 20]); // 5.5及以上版本支持

3、firstOrFail

如果查询的方法不存在,则抛出一个异常信息

项目中用法:$doctorLevel = DoctorModel::query()->with([

'level' => function ($query) {

$query->select('id', 'level_name');

}

])->where('id','339856447067199853')->select(['id', 'doctor_level'])->firstOrFail();

返回结果:

"message": "No query results for model [App\\Models\\Inquiry\\DoctorModel].",

Laravel firstOrNew 与 firstOrCreate 的区别

例如:

$item = App\Deployment::firstOrNew(

['name' => '问答小程序'], ['delayed' => 1]

);

firstOrNew 需要手动调用 save,才会保存到数据库。适合同时需要修改其他属性的场景。

firstOrCreate 会自动保存到数据库。适合不需要额外修改其他属性的场景。

注意:MassAssignmentException

firstOrCreate 一定要设置 model 的 fillable, 否则会报 MassAssignmentException 的错误。

参考: Laravel Model 的 fillable (白名单)与 guarded (黑名单)

即,create 受 fillable 的限制,但是 save 不受影响。

用法:User::firstOrCreate(['name' => 'Lisi']);

User::firstOrCreate(['name' => 'Lisi'], ['age' => 20]);  // 5.5及以上版本支持

官方文档:

https://learnku.com/docs/laravel/6.x/eloquent/5176#b438f8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值