2010-07-14 5 views
8

diciamo che ho il modello A in relazione a B.come forzare per aggiornare il valore di modello Yii

Quando scrivo:

$a = A::model()->findByPK(1); 
$a->B->doSomething(); 

ed ora B può, mediante cambiato (da altri utenti per esempio). Quando scrivo:

$a->B->doSomething(); 

utilizza i vecchi valori di B. Cosa devo fare per forza per aggiornare il valore di B prima doSomething().

risposta

0

Come ho capito quando la relazione B è dichiarata nel modello di A, l'oggetto B viene "caricato pigro" dal database quando si chiama $ a-> B. A meno che non venga memorizzato nella cache (cosa che non fa per impostazione predefinita, non credo), dovrebbe prendere una nuova copia di B ogni volta che chiami quella relazione.

Accertarsi che se doSomething() sta cambiando i dati in B, si chiami $ this-> save() in B-> doSomething(). Se si sta cambiando B ma non si salvano le modifiche, quando si interroga nuovamente per B avrà lo stesso vecchio contenuto.

<?php 
function doSomething() { 
    $this->my_data++; // change something 
    $this->save(); // save the changes 
} 
?> 

Se si desidera accedere di nuovo B dopo aver modificato, ma prima di aver salvato, è necessario impostare in una variabile in A per "cache" che, più o meno. Altrimenti, dal momento che sta ottenendo una nuova copia dal database quando si chiama $ a-> B (e non si è salvata la modifica in doSomething()), si avranno i vecchi dati. Qualcosa del genere funziona invece:

<?php 
$a = A::model()->findByPK(1); 
$B = $a->B; // save B 
$B->doSomething(); // change B 
$B->doSomething(); // change the changed B again 
$B->save(); // save both changes 
?> 

Se si tratta di un problema di concorrenza generale (che suona come potrebbe essere quando si dice "è cambiato da un altro utente"), potrebbe essere necessario attuare una sorta di blocco meccanismo, o utilizzare transazioni mySql (tramite CDbTransaction di Yii) per garantire l'integrità dei dati.

Se tutto questo non funziona, forse facendo un carico "ansioso" risolverà il vostro problema e, in questo modo:

<?php 
$posts=A::model()->with('B')->findAll(); 
?> 
+0

Yii esegue la cache delle relazioni. –

10

È possibile ottenere un valore rinfrescata 'B' dicendo:

$a->getRelated('B',true)->doSomething(); 

Il 2 ° param "vero" chiede che Yii ricaricare la relazione dal database.

4

In Yii2 la sua solo una semplice

unset($model->relation); 

quindi in questo caso unset($a->b)

0

$ a-> B-> refresh(); // per aggiornare solo B

$ a- > refresh(); // per aggiornare una e tutte naturalmente tutte le relazioni, compresa la "B"