Aggiornamento 2020
Come in Laravel> = 5.3 , se qualcuno è ancora curioso di farlo in modo semplice. La sua possibile utilizzando: updateOrCreate()
.
Ad esempio per le domande poste puoi usare qualcosa come:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Il codice sopra controlla la tabella rappresentata da ShopMeta, che sarà molto probabilmente shop_metas
se non diversamente definito nel modello stesso
e proverà a trovare la voce con
colonna shopId = $theID
e
colonna metadateKey = 2001
e se lo trova, aggiornerà la colonna shopOwner
della riga trovata in New One
.
Se trova più di una riga corrispondente, aggiornerà la prima riga che significa che ha il primario più basso id
.
Se non trovato affatto, inserirà una nuova riga con:
shopId = $theID
, metadateKey = 2001
eshopOwner = New One
Avviso
Controlla il tuo modello $fillable
e fai causa per avere ogni nome di colonna definito lì che desideri inserire o aggiornare e le colonne restanti hanno un valore predefinito o la sua id
colonna auto incrementata.
Altrimenti genererà un errore durante l'esecuzione dell'esempio sopra:
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))'
Poiché ci sarebbe un campo che avrà bisogno di valore durante l'inserimento di una nuova riga e non sarà possibile in quanto non è definito in $fillable
o non ha un valore predefinito.
Per ulteriori riferimenti, consultare la documentazione di Laravel all'indirizzo:
https://laravel.com/docs/5.3/eloquent
Un esempio da lì è:
// 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]
);
che praticamente cancella tutto.
Aggiornamento del generatore di query
Qualcuno ha chiesto se è possibile utilizzare Query Builder in Laravel. Ecco il riferimento per Query Builder dai documenti di Laravel.
Query Builder funziona esattamente come Eloquent, quindi tutto ciò che è vero per Eloquent è vero anche per Query Builder. Quindi, per questo caso specifico, usa la stessa funzione con il tuo generatore di query in questo modo:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Naturalmente, non dimenticare di aggiungere la facciata DB:
use Illuminate\Support\Facades\DB;
O
use DB;
spero possa essere d'aiuto
shopId
non sia la tua chiave primaria, giusto?