Jaki jest skrót dotyczący wstawiania nowego rekordu lub aktualizacji, jeśli istnieje?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
shopId
nie jest to twój klucz podstawowy, prawda?Odpowiedzi:
Oto pełny przykład tego, o czym mówił „lu cip”:
Poniżej znajduje się zaktualizowany link do dokumentów, które są w najnowszej wersji Laravel
Dokumenty tutaj: Zaktualizowany link
źródło
Zaktualizowano: 27 sierpnia 2014 r. - [
updateOrCreate
Wbudowany w rdzeń ...]Na wypadek, gdyby ludzie wciąż się z tym spotykali ... dowiedziałem się kilka tygodni po napisaniu tego, że jest to w rzeczywistości część rdzenia Laravel's Eloquent ...
Zagłębianie się w równoważne metody Eloquent. Możesz zobaczyć tutaj:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
dnia: 570 i: 553
Stara odpowiedź poniżej
Zastanawiam się, czy jest jakaś wbudowana funkcjonalność L4 do zrobienia tego w jakiś sposób, na przykład:
Stworzyłem tę metodę kilka tygodni temu ...
Mam nadzieję że to pomogło. Chciałbym zobaczyć alternatywę dla tego, jeśli ktoś ma coś do udostępnienia. @erikthedev_
źródło
ModelName::firstOrNew(['param' => 'condition'])->fill(Input::get())->save();
powinien to zrobić.Aktualizacja 2020
Podobnie jak w Laravel> = 5.3 , jeśli ktoś nadal jest ciekawy, jak to zrobić w łatwy sposób. Jest to możliwe za pomocą:
updateOrCreate()
.Na przykład do zadanego pytania możesz użyć czegoś takiego:
Powyższy kod sprawdzi tabelę reprezentowaną przez ShopMeta, co najprawdopodobniej będzie miało miejsce,
shop_metas
chyba że w samym modelu nie określono inaczeji spróbuje znaleźć wpis z
kolumna
shopId = $theID
i
kolumna
metadateKey = 2001
a jeśli znajdzie, zaktualizuje kolumnę
shopOwner
znalezionego wiersza doNew One
.Jeśli znajdzie więcej niż jeden pasujący wiersz, zaktualizuje pierwszy wiersz, co oznacza, że ma najniższy podstawowy
id
.Jeśli w ogóle nie zostanie znaleziony, wstawi nowy wiersz z:
shopId = $theID
,metadateKey = 2001
ishopOwner = New One
Uwaga Sprawdź swój model
$fillable
i upewnij się, że masz zdefiniowaną nazwę każdej kolumny, którą chcesz wstawić lub zaktualizować, a pozostałe kolumny mają wartość domyślną lubid
automatycznie zwiększaną.W przeciwnym razie przy wykonywaniu powyższego przykładu pojawi się błąd:
Ponieważ byłoby pole, które będzie wymagało podania wartości podczas wstawiania nowego wiersza i nie będzie to możliwe, ponieważ albo nie jest zdefiniowane w,
$fillable
albo nie ma wartości domyślnej.Więcej informacji można znaleźć w dokumentacji Laravel pod adresem : https://laravel.com/docs/5.3/eloquent
Oto jeden przykład:
co prawie wszystko wyjaśnia.
Aktualizacja narzędzia do tworzenia zapytań
Ktoś zapytał, czy jest to możliwe za pomocą Query Builder w Laravel. Tutaj jest odniesienie do Query Builder z Laravel Docs.
Query Builder działa dokładnie tak samo jak Eloquent, więc wszystko, co jest prawdziwe dla Eloquent, jest prawdziwe również dla Query Builder. W tym konkretnym przypadku po prostu użyj tej samej funkcji w swoim konstruktorze zapytań:
Oczywiście nie zapomnij dodać fasady DB:
LUB
Mam nadzieję, że to pomoże
źródło
Funkcja zapisywania:
już rób co chcesz ...
Kod Laravel:
źródło
firstOrNew
utworzy rekord, jeśli nie istnieje, i zaktualizuje wiersz, jeśli już istnieje. Możesz również użyćupdateOrCreate
tutaj pełnego przykładuJeśli jest lot z Oakland do San Diego, ustaw cenę na 99 USD. jeśli nie istnieje, utwórz nowy wiersz
Dokument referencyjny tutaj: ( https://laravel.com/docs/5.5/eloquent )
źródło
Jeśli potrzebujesz tej samej funkcjonalności korzystając z
DB
, w Laravel>= 5.5
możesz użyć:lub wersja skrócona, gdy
$attributes
i$values
są takie same:źródło
Następnie wprowadź zmiany i zapisz. Zauważ, że firstOrNew nie wykonuje wstawiania, jeśli nie został znaleziony, jeśli tego potrzebujesz, to jego firstOrCreate.
źródło
Jeszcze jedna opcja, jeśli Twój identyfikator nie jest automatycznie zwiększany i wiesz, który z nich wstawić / zaktualizować:
źródło
Podobnie jak metoda firstOrCreate, updateOrCreate utrwala model, więc nie ma potrzeby wywoływania metody save ()
I dla twojego problemu
źródło
W rzeczywistości firstOrCreate nie aktualizowałoby się w przypadku, gdy rejestr już istnieje w bazie danych. Poprawiłem nieco rozwiązanie Erika, ponieważ faktycznie potrzebowałem zaktualizować tabelę, która ma unikalne wartości nie tylko dla kolumny "id"
Wtedy użyłbyś tego w ten sposób:
źródło
jak @JuanchoRamone zamieszczone powyżej (dzięki @Juancho) jest to dla mnie bardzo przydatne, ale jeśli twoje dane są tablicami, powinieneś zmodyfikować trochę w ten sposób:
źródło
https://github.com/yadakhov/insert-on-duplicate-key
źródło
sprawdź, czy użytkownik istnieje, czy nie. Jeśli nie, włóż
źródło