web-dev-qa-db-ja.com

最初または作成

私は使用していることを知っています:

User::firstOrCreate(array('name' => $input['name'], 'email' => $input['email'], 'password' => $input['password']));

ユーザーが最初に存在するかどうかを確認し、存在しない場合は作成しますが、どのように確認しますか?提供されたすべてのパラメーターをチェックしますか、または特定のパラメーターを指定する方法がありますか? 2人のユーザーが同じ名前を持っている場合がありますが、メールアドレスは一意である必要があるため、名前ではなくメールアドレスが存在することを確認できます。

54
panthro

firstOrCreate()は、一致する前にfindsの前に存在するすべての引数をチェックします。すべての引数が一致しない場合、モデルの新しいインスタンスが作成されます。

特定のフィールドのみをチェックする場合は、firstOrCreate(['field_name' => 'value'])を配列内の1つのアイテムのみで使用します。これは、一致する最初のアイテムを返すか、一致しない場合は新しいアイテムを作成します。

firstOrCreate()firstOrNew()の違い:

  • firstOrCreate()は、一致するものが見つからない場合、データベースに新しいエントリを自動的に作成します。それ以外の場合は、一致したアイテムが提供されます。
  • firstOrNew()は、一致するものが見つからなかった場合に使用する新しいモデルインスタンスを提供しますが、明示的に指定した場合にのみデータベースに保存されます(モデルでsave()を呼び出します)。それ以外の場合は、一致したアイテムが提供されます。

どちらを選択するかは、何をしたいかによって異なります。初めて保存する前にモデルインスタンスを変更する場合(例:nameまたは必須フィールドの設定)、firstOrNew()を使用する必要があります。引数を使用して、変更せずにデータベースに新しいモデルインスタンスをすぐに作成できる場合は、firstOrCreate()を使用できます。

113
lowerends

以前の回答は廃止されました。 Laravel 5.3、firstOrCreateには2番目のパラメーターvaluesがあり、これは新しいレコードには使用されますが、検索には使用されないため、1つのステップで達成できます

$user = User::firstOrCreate([
    'email' => 'dummy@domain.com'
], [
    'firstName' => 'Taylor',
    'lastName' => 'Otwell'
]);
48
umbrel

アップデート:

Laravel 5.3以降、これを1つのステップで実行することが可能です。 firstOrCreateメソッドは、オプションの2番目の配列を引数として受け入れるようになりました。

最初の配列引数は、フィールド/値が一致する配列です。2番目の配列は、最初の配列のフィールド/値の一致によって一致が見つからない場合にモデルの作成に使用する追加フ​​ィールドです。

ドキュメントを参照

2
A_funs