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:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
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 ist
und 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 aktualisiert New 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 einen id
automatisch inkrementierten Spaltenwert haben.
Andernfalls wird beim Ausführen des obigen Beispiels ein Fehler ausgegeben:
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field '...' doesn't have a default value (SQL: insert into `...` (`...`,.., `updated_at`, `created_at`) values (...,.., xxxx-xx-xx xx:xx:xx, xxxx-xx-xx xx:xx:xx))'
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:
// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
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:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Vergessen Sie natürlich nicht, die DB-Fassade hinzuzufügen:
use Illuminate\Support\Facades\DB;
ODER
use DB;
Ich hoffe, es hilft
shopId
ist nicht dein Primärschlüssel, oder?