1. ホーム
  2. php

Laravel firstOrNew どのようにそれが最初または新しいかどうかを確認するには?

2023-10-19 19:57:22

質問

Laravelの機能である firstOrNew() を使用して、新しいユーザーを作成したり、既存のユーザーを見つけて更新したりしています。

オブジェクトが作成された後、それが以前から存在していたのか、それとも新しいオブジェクトなのかを知るにはどうしたらよいでしょうか。

アイデアはこのようなものです。

$user = \App\User::firstOrNew([
    'email' => $userData->getEmail(),
    'name' => $userData->getName(),
]);

if ($user->new) { // some way to check
    // user was created now
} else {
    //user already existed
}

どのように解決するのですか?

firstOrNew()

この関数は、データベースから最初のレコードを返すか、データベースにまだ存在しない新しいモデルインスタンスをインスタンス化するかのどちらかです。したがって、インスタンスがデータベースから引き出されたのか、それとも新しいインスタンスなのかを確認したい場合は、そのインスタンスに対して exists プロパティ (関数ではない)をモデルに追加します。

if ($user->exists) {
    // user already exists and was pulled from database.
} else {
    // user created from 'new'; does not exist in database.
}


元の質問は firstOrNew() に関するものでしたが、多くの人がここに来て firstOrCreate() のために来ている人も多いようです。 firstOrCreate() は異なるので、別のチェックが必要です。

firstOrCreate()

この関数は、データベースから最初のレコードを返すか、データベースに新しいレコードを作成してそれを返します。新しく作成されたレコードはデータベースに存在することになるので、この関数で exists プロパティをチェックすることはできません。なぜなら、両方のインスタンスで真になるからです。しかし wasRecentlyCreated プロパティを確認することができます。このプロパティは、現在のモデルインスタンスがデータベース内に作成されたばかりの場合は真、既にデータベース内にある場合は偽となります。

if ($user->wasRecentlyCreated) {
    // user just created in the database; it didn't exist before.
} else {
    // user already existed and was pulled from database.
}