Laravel :: firstOrNew,firstOrCreate,firstOr和updateOrCreate方法

如果您曾经使用过Laravel,您可能知道创建有说服力的模型的标准方法,如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()

如果没有找到现有的Model,您还可以传递一个附加属性数组以设置为第二个参数:

$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方法。firstOr 方法从查询中检索第一个 Model,或者如果没有找到匹配的 Model,它将调用传递的回调。如果你在创建一个用户时需要执行额外的步骤,或者想要做一些创建一个新用户以外的事情,这将会非常有用:

$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::where('email', request('email'))->first();

if ($user !== null) {
    $user->update(['name' => request('name')]);
} else {
    $user = User::create([
      'email' => request('email'),
      'name' => request('name'),
    ]);
}

// 与用户一起做其他事情

为此使用 updateOrCreate 方法:

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

// 与用户一起做其他事情

结论

总的来说,我认为这些方法可以在某些情况下帮助清理代码,并且是在工具带中的理想选择!让我知道您是否知道其他真正有用且不为人所知的东西。我喜欢学习这些使Laravel变得如此出色的小细节。