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();
?>
Yii esegue la cache delle relazioni. –