Como lo entiendo cuando se declara la relación B en el modelo de A, es ser "cargado ligeramente" de la base de datos del objeto B cuando se llama a $ a-> B. A menos que se almacena en caché (que no lo hace por defecto no lo creo) hay que agarrar una copia nueva de B cada vez que llame a esa relación.
Me aseguraría de que si doSomething() está cambiando los datos en B que también se llama $ this-> Save() en el interior B-> doSomething(). Si está cambiando B pero no guarda los cambios, cuando vuelva a consultar B tendrá el mismo contenido anterior.
<?php
function doSomething() {
$this->my_data++; // change something
$this->save(); // save the changes
}
?>
Si desea acceder a la B de nuevo después de que lo haya cambiado, pero antes de que haya guardado, tendrá que establecer en una variable de la A a la "caché" que, en cierto modo. De lo contrario, ya que se está haciendo una copia nueva de la base de datos cuando se llama a $ a-> B (y que no guarde el cambio en doSomething()), tendrá los datos antiguos. Algo como esto va a funcionar en su lugar:
<?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
?>
Si se trata de un problema de concurrencia general (que suena como que podría ser cuando se dice "es cambiado por otro usuario"), puede que tenga que aplicar algún tipo de bloqueo mecanismo, o utilizar transacciones mySQL (a través de CDbTransaction de Yii) para asegurar la integridad de los datos.
Si nada de esto funciona, tal vez haciendo una carga "ansiosos" va a arreglar el problema, así, de este modo:
<?php
$posts=A::model()->with('B')->findAll();
?>
Yu hace las relaciones de caché. –