Zuerst oder erstellen


76

Ich weiß mit:

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

Überprüft, ob der Benutzer zuerst vorhanden ist, wenn er ihn nicht erstellt, aber wie wird er überprüft? Überprüft es alle bereitgestellten Parameter oder gibt es eine Möglichkeit, einen bestimmten Parameter anzugeben, z. B. kann ich nur überprüfen, ob die E-Mail-Adresse vorhanden ist und nicht der Name - da zwei Benutzer möglicherweise denselben Namen haben, ihre E-Mail-Adresse jedoch sein muss einzigartig.

Antworten:


140

firstOrCreate()prüft, ob alle Argumente vorhanden sind, bevor findseine Übereinstimmung vorliegt . Wenn nicht alle Argumente übereinstimmen, wird eine neue Instanz des Modells erstellt.

Wenn Sie nur ein bestimmtes Feld überprüfen möchten, verwenden Sie es firstOrCreate(['field_name' => 'value'])mit nur einem Element im Array. Dies gibt das erste übereinstimmende Element zurück oder erstellt ein neues, wenn keine Übereinstimmungen gefunden werden.

Der Unterschied zwischen firstOrCreate()und firstOrNew():

  • firstOrCreate()erstellt automatisch einen neuen Eintrag in der Datenbank, wenn keine Übereinstimmung gefunden wird. Andernfalls erhalten Sie den passenden Artikel.
  • firstOrNew()Sie erhalten eine neue Modellinstanz, mit der Sie arbeiten können, wenn keine Übereinstimmung gefunden wurde. Sie wird jedoch nur dann in der Datenbank gespeichert, wenn Sie dies explizit tun (Aufruf save()des Modells). Andernfalls erhalten Sie den passenden Artikel.

Die Wahl zwischen dem einen oder anderen hängt davon ab, was Sie tun möchten. Wenn Sie die Modellinstanz ändern möchten, bevor sie zum ersten Mal gespeichert wird (z. B. Festlegen eines nameoder eines Pflichtfelds), sollten Sie verwenden firstOrNew(). Wenn Sie die Argumente nur verwenden können, um sofort eine neue Modellinstanz in der Datenbank zu erstellen, ohne sie zu ändern, können Sie sie verwenden firstOrCreate().


Ich kenne. Wie kann ich angeben, dass bestimmte Attribute übereinstimmen sollen? Ich möchte nur E-Mails abrufen und dann, wenn dies mit Update übereinstimmt, einen neuen Datensatz erstellen.
Pantro

Danke, ich habe getan: $ user = User :: firstOrNew (Array ('email' => Input :: get ('email'))); $ user-> name = Input :: get ('name'); $ user-> save (); Richtig?
Pantro

Ich habe es in firstOrNew geändert, oder hätte ich firstOrCreate verwenden sollen?
Pantro

Sie können dies in einem Schritt tun : $user = User::firstOrCreate(array('email' => Input::get('email'), 'name' => Input::get('name'))).
senkt

Sie können nicht alles in einem Schritt erledigen. Wenn ein neuer Benutzer dieselbe E-Mail hat, ABER einen anderen Namen, wird ein neuer Datensatz erstellt (er sollte aktualisiert werden, da die E-Mail eindeutig ist). Deshalb kann ich keine Massenaufgabe machen. Es sei denn, Sie kennen eine Lösung?
Pantro

70

Die vorherige Antwort ist veraltet. Es ist möglich, in einem Schritt zu erreichen, da Laravel 5.3 firstOrCreatejetzt über einen zweiten Parameter verfügt values, der für neue Datensätze verwendet wird, jedoch nicht für die Suche

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

25
Ich halte es für wichtig zu erwähnen, dass die Felder, die Sie für die Datenbank festlegen möchten, protected $fillableim entsprechenden Modell hinzugefügt werden müssen, da die Massenzuweisung verwendet wird.
WhyAyala

Warum Ayala Hinweis ist sehr wichtig. Ursache, wenn Sie in protected $ fillable = ['email'] einfügen; nur Schlüssel aus der ersten Methode firstOrCreate Parameter Abfrage wäre wie -> INSERT INTO tabellenname ( ‚E - Mail‘, updated_at, created_at) VALUES ...
darjus

3

Ein Update:

Ab Laravel 5.3 ist dies in einem einzigen Schritt möglich. Die firstOrCreateMethode akzeptiert jetzt ein optionales zweites Array als Argument.

Das erste Array-Argument ist das Array, auf dem die Felder / Werte übereinstimmen, und das zweite Array sind die zusätzlichen Felder, die bei der Erstellung des Modells verwendet werden sollen, wenn keine Übereinstimmung über die Übereinstimmung der Felder / Werte im ersten Array gefunden wird:

Siehe Dokumentation


1
Tolle ergänzende Infos. Könnte als Kommentar gemacht werden, nicht per se als Antwort; )
Hugomosh

3

firstOrCreate () prüft, ob alle Argumente vorhanden sind, bevor eine Übereinstimmung gefunden wird.

Wenn Sie nur ein bestimmtes Feld überprüfen möchten, verwenden Sie firstOrCreate (['Feldname' => 'Wert']) wie

$user = User::firstOrCreate([
    'email' => 'abcd@gmail.com'
], [
    'firstName' => 'abcd',
    'lastName' => 'efgh',
    'veristyName'=>'xyz',
]);

Dann wird nur die E-Mail überprüft

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.