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:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
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 inaczej
i spróbuje znaleźć wpis z
kolumna shopId = $theID
i
kolumna metadateKey = 2001
a jeśli znajdzie, zaktualizuje kolumnę shopOwner
znalezionego wiersza do New 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ą lub id
automatycznie zwiększaną.
W przeciwnym razie przy wykonywaniu powyższego przykładu pojawi się błąd:
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))'
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:
// 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]
);
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ń:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Oczywiście nie zapomnij dodać fasady DB:
use Illuminate\Support\Facades\DB;
LUB
use DB;
Mam nadzieję, że to pomoże
shopId
nie jest to twój klucz podstawowy, prawda?