Как я понимаю, когда отношение 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();
?>