как заставить обновить значение модели в yii - PullRequest
9 голосов
/ 14 июля 2010

допустим, у меня есть модель А по отношению к В.

Когда я пишу:

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

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

$a->B->doSomething(); 

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

Ответы [ 5 ]

17 голосов
/ 20 июля 2010

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

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

10 голосов
/ 14 марта 2013

Обновленное значение «B» можно получить, сказав:

$a->getRelated('B',true)->doSomething(); 

Второй параметр «true» запрашивает, чтобы yii перезагрузил отношение из базы данных.

6 голосов
/ 26 марта 2015

В Yii2 это просто

unset($model->relation);

, поэтому в этом случае unset($a->b)

0 голосов
/ 02 февраля 2017

$ a-> B-> refresh (); // обновить только B

$ a-> refresh (); // обновить все и, естественно, все отношения, включая "B"

0 голосов
/ 17 июля 2010

Как я понимаю, когда отношение 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();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...