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