как вызвать для обновления значения модели в yii

скажем, у меня есть модель A с отношением к B.

Когда я пишу:

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

и теперь B май измененным (другим пользователем, например). Когда я пишу:

$a->B->doSomething(); 

это использует старые значения B. Что я должен сделать для принуждения для обновления значения B прежде doSomething ().

9
задан liysd 14 July 2010 в 04:32
поделиться

2 ответа

Yii предоставляет метод refresh (), я думаю, это то, что вы ищете?

http://www.yiiframework.com/doc/api/CActiveRecord#refresh-detail

17
ответ дан 4 December 2019 в 06:55
поделиться

Как я понимаю, когда отношение 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();
?>
0
ответ дан 4 December 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: