2014-11-11 9 views
20

In yii2, come posso salvare più record correlati in db in una singola chiamata di salvataggio e una singola transazione. Ho due tabelle:Yii2 salva i record correlati in una singola chiamata di salvataggio nella singola transazione

User - id, name 
UserAddress - id , user_id , city 

tabella utente ha uno a molti relazione al tavolo UserAdress

Quello che voglio fare è:

UserAddress ua = new UserAddress(); 
ua.city = "fff" 

User u = new User(); 
u.name = "test"; 
u.userAddress = new Array(ua); 
u.save(); 

chiamando risparmiare sui utente deve salvare utente e useraddress con user_id impostato su user.id pure

risposta

24
// You need create hasMany relation 'userAddress' (look guide relations) 

$transaction = Yii::$app->db->beginTransaction(); 

try { 

    $user = new User(); 
    $user->name = 'Name'; 
    $user->save(); 

    $ua = new UserAddress(); 
    $ua->city = 'City'; 

    $user->link('userAddress', $ua); // <-- it creates new record in UserAddress table with ua.user_id = user.id 

    $transaction->commit(); 

} catch (Exception $e) { 

    $transaction->rollBack(); 

} 
+0

sia l'inserto sia in singola transnazionale? –

+0

@GauravSingla modificato. Ora sì. –

+0

Si sta utilizzando il metodo ['link()'] (http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#link() -detail) nell'esempio su due nuovi attivi creati record. Tuttavia, nell'articolo "[Salvataggio delle relazioni] (http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#saving-relations)" nei documenti di Yii2 c'è un'informazione: "_Nota: tu non può collegare due istanze di record attivo appena create_ "e l'esempio mostra solo il collegamento di un nuovo sottomodello a un modello master esistente. Sembra che la tua soluzione non funzioni o che ci sia un bug nei documenti di Yii2. Hai provato la tua risposta? – trejder

5

In aggiunta a pr Risposta eviosa Propongo una variante che funziona senza relazioni preliminarmente definite e con la gestione esplicita degli errori di validazione.

Yii::$app->db->transaction(function(){ 

    $user = new User(); 
    $user->name = 'Name'; 

    if(!$user->save()){ 
     throw new Exception('Can\'t be saved user model. Errors: '. join(', ', $user->getFirstErrors())); 
    } 

    $userAddress = new UserAddress(); 
    $userAddress->city  = 'City'; 
    $userAddress->user_id = $user->id; 

    if(!$userAddress->save()){ 
     throw new Exception('Can\'t be saved user address model. Errors: '. join(', ', $userAddress->getFirstErrors())); 
    } 

}); 

Questo codice assicura rigorosamente che entrambi i record saranno salvati. Se uno dei modelli non può essere salvato, verrà generata un'eccezione con errore di convalida.

Problemi correlati