编程

Laravel firstOrNew, firstOrCreate, firstOr, 和 updateOrCreate 方法

1081 2022-02-28 19:17:30

如果你已经用过Laravel, 你应该已经知道创建Eloquent模型的标准方法,如make(), create(), update 和save(). Laravel 还有其他一些能用于创建和更新模型的方法。本文将介绍这些方法,解释他们怎么用。

firstOrNew

firstOrNew方法用于寻找匹配某些约束条件的第一个数据模型,或在这些匹配的约束条件不存在的时候新建。

一般情况下的代码示例如下:

$user = User::where('email', request('email'))->first();
 
if ($user === null) {
    $user = new User(['email' => request('email')]);
}
 
$user->name = request('name');
 
$user->save()

转换后代码如下:

$user = User::firstOrNew(['email' =>  request('email')]);
 
$user->name = request('name');
 
$user->save()

如果模型数据不存在,你也可以传送数组作为第二个参数:

$user = User::firstOrNew(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
 
$user->save();

firstOrCreate

firstOrCreate方法与firstOrNew方法极其相似。它会尝试查找匹配你传入的第一个参数对应属性的模型。如果模型不存在,会在采用传入第二个参数后自动创建保存新模型:

$user = User::firstOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
 
// No call to $user->save() needed

firstOr

firstOr 方法会检索查询的第一个模型,或者如果模型不匹配,会调用传入的回调函数。比如,当你创建新用户时,需要做一些额外的动作时:

$user = User::where('email', request('email'))->firstOr(function () {
    $account = Account::create([ //... ]);
 
    return User::create([
        'account_id' => $account->id,
        'email' => request('email'),
    ]);
});

updateOrCreate

updateOrCreate方法会尝试会尝试使用传入的第一个参数检索匹配约束的模型。如果模型存在,会更新第二个参数匹配的属性。如果模型不存在,会以两个参数约束的属性创建新模型。

代码示例:

$user = User::updateOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
 
// Do other things with the User