[Laravel] firstOrCreateで取得したレコードが既存か新規かを判別する方法

Laravel Laravel

はじめに

LaravelのfirstOrCreateメソッドは、指定した条件に合致するレコードを検索し、存在しなければ新たに作成する便利なメソッドです。

しかし、このとき「取得したレコードが既に存在していたものなのか、それとも新規に作成されたものなのか」を判別したいケースがあります。

この記事では、その方法を分かりやすく解説します。


firstOrCreateの基本的な使い方

firstOrCreateは次のように使用します。

$user = User::firstOrCreate(
    ['email' => 'test@example.com'], // 検索条件
    ['name' => 'Taro', 'password' => bcrypt('password')] // 新規作成時の値
);

この場合、

  • emailがtest@example.comのユーザーが存在すれば、そのレコードを返します
  • 存在しなければ、指定した値で新規作成します

新規作成か既存取得かを判別する方法

firstOrCreateの返り値であるEloquentモデルには、wasRecentlyCreated プロパティが用意されています。

使用例

$user = User::firstOrCreate(
    ['email' => 'test@example.com'],
    ['name' => 'Taro', 'password' => bcrypt('password')]
);

if ($user->wasRecentlyCreated) {
    echo "新規作成されました";
} else {
    echo "既存レコードを取得しました";
}

wasRecentlyCreatedプロパティとは

wasRecentlyCreatedは、Eloquentモデルが直近の操作で新規作成された場合にtrueを返します。

firstOrCreateだけでなく、createやsaveなどで新しく保存されたモデルでも利用可能です。


注意点

  • wasRecentlyCreatedは、そのモデルが直前の処理で作成されたかどうかのみを判断します
  • 一度モデルを再読み込み (refreshなど) すると、この値はfalseになります
  • updateOrCreateでも同様に利用可能です

まとめ

  • firstOrCreateで取得したレコードが新規作成か既存かはwasRecentlyCreatedで判別可能
  • 新規作成された場合はtrue、既存レコードの場合はfalse
  • 再読み込みするとfalseになるので注意

実用例

$user = User::firstOrCreate(
    ['email' => 'test@example.com'],
    ['name' => 'Taro', 'password' => bcrypt('password')]
);

if ($user->wasRecentlyCreated) {
    // 新規登録後の初期設定処理
} else {
    // 既存ユーザーへの別処理
}

これで、firstOrCreateの結果を正しく判別できるようになります。

コメント

タイトルとURLをコピーしました