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.

panthro
quelle

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().

senkt
quelle
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' => '[email protected]'
], [
    'firstName' => 'Taylor',
    'lastName' => 'Otwell'
]);
Regenschirm
quelle
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

A_funs
quelle
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' => '[email protected]'
], [
    'firstName' => 'abcd',
    'lastName' => 'efgh',
    'veristyName'=>'xyz',
]);

Dann wird nur die E-Mail überprüft

umar_sharif
quelle