скажем, у меня есть модель A с отношением к B.
Когда я пишу:
$a = A::model()->findByPK(1);
$a->B->doSomething();
и теперь B май измененным (другим пользователем, например). Когда я пишу:
$a->B->doSomething();
это использует старые значения B. Что я должен сделать для принуждения для обновления значения B прежде doSomething ().
Yii предоставляет метод refresh (), я думаю, это то, что вы ищете?
http://www.yiiframework.com/doc/api/CActiveRecord#refresh-detail
Как я понимаю, когда отношение B объявлено в модели A, объект B "лениво загружается" из базы данных, когда вы вызываете $a->B. Если только он не кэшируется (чего он не делает по умолчанию, я не думаю), он должен получать свежую копию B каждый раз, когда вы вызываете это отношение.
Я бы убедился, что если doSomething() изменяет данные в B, то вы также вызываете $this->save() внутри B->doSomething(). Если вы изменяете B, но не сохраняете изменения, то при повторном запросе к B у вас будет старое содержимое.
<?php
function doSomething() {
$this->my_data++; // change something
$this->save(); // save the changes
}
?>
Если вы хотите получить доступ к B снова после изменения, но до сохранения, вам нужно будет установить его в переменную в A, чтобы как бы "кэшировать" его. В противном случае, так как при вызове $a->B (а вы не сохранили изменение в doSomething()) из базы данных будет получена свежая копия, у вас будут старые данные. Вместо этого будет работать что-то вроде этого:
<?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
?>
Если это общая проблема параллелизма (что похоже на то, что это может быть, когда вы говорите "это изменено другим пользователем"), вам может понадобиться реализовать какой-то механизм блокировки или использовать транзакции mySql (через CDbTransaction в Yii) для обеспечения целостности данных.
Если ничего из этого не работает, возможно, выполнение "нетерпеливой" загрузки также решит вашу проблему, например, так:
<?php
$posts=A::model()->with('B')->findAll();
?>