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_metasse 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 shopOwnerdella 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 = 2001eshopOwner = New One
Avviso
Controlla il tuo modello $fillablee 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 idcolonna 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 $fillableo 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
shopIdnon sia la tua chiave primaria, giusto?