2015-07-25 9 views
13
$cardQueryList = []; 
foreach($cards as $cardName => $quantity) { 
    $cardQueryList[] = [ 
     'username' => $user->username, 
     'card_uid' => $card->uid, 
     'have_quantity' => $quantity 
    ]; 
} 

Collection::insert($cardQueryList); 

Il codice precedente crea nuove righe anche se la riga esiste. Come posso renderlo così se la riga esiste, si aggiorna. E se non crea la riga? Una risposta eloquente o fluente sarebbe ottimale, ma sono aperto a raw se non c'è altro modo.Come inserire o aggiornare la massa in una singola query (non un ciclo di query for) utilizzando Laravel 4.2

Mi piacerebbe fare un aggiornamento/inserimento di massa con una singola query. Non un ciclo di query for per ogni record. Idealmente mi piacerebbe colpire il database una volta per ovvi motivi.

Inoltre Ho già controllato il seguente link:

Insert a new record if not exist and update if exist, laravel eloquent

I lavori di cui sopra per un singolo record di aggiornamento/inserimento. Che se avessi corso con un ciclo for sarebbe molto lento. Sto cercando una risposta che permetta un inserimento/aggiornamento di massa in una singola query.

Nota: sto usando, sia "username" che "card_uid" come chiave. Quindi sostanzialmente quando trovo una riga con detto nome utente e card_uid, vorrei aggiornare la riga corrispondente. Altrimenti crea una nuova riga.

+0

u hanno alcuna idea di come fare questo con raw-sql? non eloquente o querybuilder – M0rtiis

+0

@ M0rtiis: Questa è una buona domanda. Mi ci vorrebbe un po 'per capire. MySQL non è il mio forte. – rotaercz

+0

dovresti leggere questo https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – M0rtiis

risposta

0

Se non si desidera che i duplicati abbiano il proprio schema DB impedire l'immissione di voci duplicate. Cattura l'errore in questo caso e continua semplicemente.

+0

Grazie per la risposta. Puoi mostrarmi un esempio di cosa intendi nel codice? – rotaercz

4

In genere il tipo di SQL si sarebbe utilizzando sarebbe qualcosa sulla falsariga di quanto segue: -

insert into `TABLE` (`FIELD1`,`FIELD2`, `FIELD3`) values ('VALUE1','VALUE2','VALUE3') 
    on duplicate key 
     update 
      `FIELD1`='VALUE1', 
      `FIELD2`='VALUE2', 
      `FIELD1`='VALUE3'; 

Come si può usare questo con laravel Non potevo dire! Spiacenti, hai dimenticato i nomi dei campi nella parte di aggiornamento

+0

Apprezzo comunque la risposta! Domanda, come controllerebbe la parte fondamentale del tuo codice quando sto usando, sia "username" che "card_uid" come chiave? Quindi in pratica se esiste un nome utente con card_uid? – rotaercz

+1

Questo post potrebbe interessare http://stackoverflow.com/questions/28078484/update-composite-key-on-duplicate-key – RamRaider

2
<?php 

$valuesArray = []; 

foreach($cards as $cardName => $quantity) 
{ 
    $valuesArray[] = "('".$user->username."','".$card->uid."','".$quantity."')"; 
} 

$db->query 
(
    "INSERT INTO `TABLE` (`username`,`card_uid`, `have_quantity`) VALUES ".implode(',', $valuesArray)." 
    ON DUPLICATE KEY UPDATE `have_quantity` = VALUES(`have_quantity`);" 
); 

Assicurati di avere una chiave primaria su nome utente e card_uid. Inoltre, non dimenticare di sfuggire ai valori e di eseguire la query solo se $ valuesArray non è vuoto.

0

Si può provare questo:

Collection::firstOrNew([ 
    'username' => $user->username, 
    'card_uid' => $card->uid, 
    'have_quantity' => $cards['quantity'] 
]) 
->save(); 

Per rendere più lavoro, aggiungere $fillable proprietà con i nomi dei campi assegnabili di massa nel modello Collection, ad esempio:

protected $fillable = ['username', 'card_uid', 'have_quantity']; 
+0

Attualmente il mio modello dispone di $ fillable impostati in questo modo: protected $ fillable = ['username ',' card_uid ',' have_quantity ',' want_quantity ']; Non sono proprio sicuro di seguire la parte save()? Puoi fornire un esempio con 2 o più righe da riempire? – rotaercz

+0

può essere un'operazione di massa? Sembra essere solo single – itsazzad

Problemi correlati