Laravel firstOrNew、firstOrCreate、firstOr 和 updateOrCreate 方法
发布日期 作者 Jason Beggs
如果您一直在使用 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
方法。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::where('email', request('email'))->first(); if ($user !== null) { $user->update(['name' => request('name')]);} else { $user = User::create([ 'email' => request('email'), 'name' => request('name'), ]);} // Do other things with the User
使用 updateOrCreate
方法将其改为
$user = User::updateOrCreate( ['email' => request('email')], ['name' => request('name')]); // Do other things with the User
结论
总的来说,我认为这些方法可以在某些情况下帮助清理您的代码,并且是您工具箱中非常不错的选择!如果您知道任何其他真正有用但不太知名的方法,请告诉我。我喜欢学习这些使 Laravel 如此易于使用的小细节。
TALL 堆栈(Tailwind CSS、Alpine.js、Laravel 和 Livewire)顾问,也是 designtotailwind.com 的所有者。