firstOrCreate() と firstOrNew()

LaravelのEloquentで非常に便利なメソッド、firstOrCreate() と firstOrNew() について書きたいと思います。

データベースを操作する際に、特定のレコードが存在するか確認してから新しいレコードを作成する状況で、この2つのメソッドはとても役立ちます。

どのように動作するのか、いつ使い分けるべきか、具体的な例を交えて解説します。

1.firstOrCreate() と firstOrNew() の紹介

 この2つのメソッドは同じ目的を持っています。それは、特定の属性を持つレコードがデータベースに既に存在するかどうかを確認することです。

もし存在すれば、そのレコードを返し、存在しない場合は新しいレコードを作成します。しかし、チェック後の動作において、両方には違いがあります。

2.firstOrCreate() と firstOrNew() の違い

firstOrCreate(): このメソッドは、レコードを探すだけでなく、該当するレコードが見つからなかった場合に自動的に新しいレコードをデータベースに保存します。

指定された属性に基づいてレコードを検索します。

一致するレコードが見つからない場合は、新しいレコードを作成し、すぐにデータベースに保存します。

firstOrNew(): このメソッドも指定された属性に基づいてレコードを探しますが、該当するレコードが見つからない場合は、新しいインスタンスのみを返します。

データベースに自動的に保存されることはなく、手動で save() メソッドを呼び出して保存する必要があります。

3.それぞれの使うべき場合

firstOrCreate():

レコードが見つからなかった場合に、自動的にデータベースに新しいレコードを保存したいとき。保存前に追加の処理が必要ない場合に使うと、コードが簡潔になります。

例:

$user = User::firstOrCreate(

[‘email’ => ‘user@gmail.com’],
[‘name’ => ‘Watanabe’, ‘password’ => bcrypt(‘watanabe12’)]
);
firstOrNew()

レコードをデータベースに保存する前に、追加の処理やカスタマイズが必要なとき。保存前にレコードを手動で調整したい場合に適しています。

例:

$user = User::firstOrNew([‘email’ => ‘user@gmail.com’]);
if (!$user->exists) {
$user->name = ‘Watanabe’;
$user->password = bcrypt(‘watanabe12’);
$user->save();
}

上記の例では、firstOrNew() がインスタンスを返した後に、レコードを保存する前に属性を調整することができます。

4.まとめ

firstOrCreate() を使う 場合: レコードを自動で作成し、保存プロセスをシンプルにしたいとき。

firstOrNew() を使う 場合: レコードの保存プロセスをコントロールし、保存前にカスタマイズが必要なとき。