Was ist die Abkürzung zum Einfügen eines neuen Datensatzes oder zum Aktualisieren, falls vorhanden?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
shopId
ist nicht dein Primärschlüssel, oder?Antworten:
Hier ist ein vollständiges Beispiel dafür, worüber "lu cip" sprach:
Unten finden Sie den aktualisierten Link der Dokumente, die sich auf der neuesten Version von Laravel befinden
Docs hier: Aktualisierter Link
quelle
Aktualisiert: 27. August 2014 - [
updateOrCreate
Eingebaut in den Kern ...]Nur für den Fall, dass die Leute immer noch darauf stoßen ... Ich habe ein paar Wochen nach dem Schreiben herausgefunden, dass dies tatsächlich Teil von Laravels Eloquent's Kern ist ...
Eintauchen in die äquivalenten Methoden von Eloquent. Sie können hier sehen:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
am: 570 und: 553
Alte Antwort unten
Ich frage mich, ob es eine eingebaute L4-Funktionalität gibt, um dies auf irgendeine Weise zu tun, wie zum Beispiel:
Ich habe diese Methode vor ein paar Wochen erstellt ...
Ich hoffe das hilft. Ich würde gerne eine Alternative dazu sehen, wenn jemand eine zu teilen hat. @erikthedev_
quelle
ModelName::firstOrNew(['param' => 'condition'])->fill(Input::get())->save();
Sollte es tun.2020 Update
Wie in Laravel> = 5.3 , wenn jemand noch neugierig ist, wie man das auf einfache Weise macht. Es ist möglich mit :
updateOrCreate()
.Zum Beispiel können Sie für gestellte Fragen etwas verwenden wie:
Der obige Code überprüft die von ShopMeta dargestellte Tabelle. Dies ist höchstwahrscheinlich der Fall,
shop_metas
sofern im Modell selbst nichts anderes definiert istund es wird versuchen, einen Eintrag mit zu finden
Säule
shopId = $theID
und
Säule
metadateKey = 2001
und wenn es findet, wird die Spalte
shopOwner
der gefundenen Zeile auf aktualisiertNew One
.Wenn mehr als eine übereinstimmende Zeile gefunden wird, wird die allererste Zeile aktualisiert, dh die niedrigste Primärzeile
id
.Wenn überhaupt nicht gefunden, wird eine neue Zeile eingefügt mit:
shopId = $theID
,metadateKey = 2001
undshopOwner = New One
Hinweis Überprüfen Sie Ihr Modell auf
$fillable
und stellen Sie sicher, dass dort jeder Spaltenname definiert ist, den Sie einfügen oder aktualisieren möchten, und dass Restspalten entweder einen Standardwert oder einenid
automatisch inkrementierten Spaltenwert haben.Andernfalls wird beim Ausführen des obigen Beispiels ein Fehler ausgegeben:
Da es ein Feld geben würde, das beim Einfügen einer neuen Zeile einen Wert benötigt, ist dies nicht möglich, da es entweder nicht in definiert ist
$fillable
oder keinen Standardwert hat.Weitere Informationen finden Sie in der Laravel-Dokumentation unter: https://laravel.com/docs/5.3/eloquent
Ein Beispiel von dort ist:
das klärt so ziemlich alles.
Update des Abfrage-Generators
Jemand hat gefragt, ob es möglich ist, Query Builder in Laravel zu verwenden. Hier finden Sie eine Referenz für Query Builder aus Laravel-Dokumenten.
Query Builder funktioniert genauso wie Eloquent, sodass alles, was für Eloquent gilt, auch für Query Builder gilt. Verwenden Sie für diesen speziellen Fall einfach dieselbe Funktion mit Ihrem Abfrage-Generator wie folgt:
Vergessen Sie natürlich nicht, die DB-Fassade hinzuzufügen:
ODER
Ich hoffe, es hilft
quelle
Speicherfunktion:
mach schon was du willst ...
Laravel-Code:
quelle
firstOrNew
erstellt einen Datensatz, falls nicht vorhanden, und aktualisiert eine Zeile, falls bereits vorhanden. Sie könnenupdateOrCreate
hier auch das vollständige Beispiel verwendenWenn es einen Flug von Oakland nach San Diego gibt, setzen Sie den Preis auf 99 US-Dollar. Wenn nicht vorhanden, erstellen Sie eine neue Zeile
Referenzdokument hier: ( https://laravel.com/docs/5.5/eloquent )
quelle
Wenn Sie dieselbe Funktionalität mit dem benötigen
DB
, können Sie in Laravel Folgendes>= 5.5
verwenden:oder die Kurzfassung, wenn
$attributes
und gleich$values
sind:quelle
Nehmen Sie dann Ihre Änderungen vor und speichern Sie sie. Beachten Sie, dass firstOrNew das Einfügen nicht ausführt, wenn es nicht gefunden wird. Wenn Sie dies benötigen, ist es firstOrCreate.
quelle
Eine weitere Option, wenn Ihre ID nicht automatisch inkrementiert wird und Sie wissen, welche Sie einfügen / aktualisieren müssen:
quelle
Wie die firstOrCreate-Methode behält updateOrCreate das Modell bei, sodass save () nicht aufgerufen werden muss.
Und für Ihr Problem
quelle
Tatsächlich würde firstOrCreate nicht aktualisiert, falls das Register bereits in der Datenbank vorhanden ist. Ich habe Eriks Lösung ein wenig verbessert, da ich tatsächlich eine Tabelle aktualisieren musste, die eindeutige Werte nicht nur für die Spalte "id" enthält.
Dann würden Sie es so verwenden:
quelle
Wie @JuanchoRamone oben gepostet (danke @Juancho) ist es sehr nützlich für mich, aber wenn Ihre Daten Array sind, sollten Sie ein wenig wie folgt ändern:
quelle
https://github.com/yadakhov/insert-on-duplicate-key
quelle
Überprüfen Sie, ob ein Benutzer vorhanden ist oder nicht. Wenn nicht einfügen
quelle