假设我的模型A与B有关。
当我写:
$a = A::model()->findByPK(1);
$a->B->doSomething();
现在可以更改B(例如,由其他用户更改)。我写的时候:
$a->B->doSomething();
它使用B的旧值。在doSomething()之前,我应该强制刷新B的值。
答案 0 :(得分:17)
Yii提供了一个refresh()方法,我认为这就是你要找的东西?
http://www.yiiframework.com/doc/api/CActiveRecord#refresh-detail
答案 1 :(得分:10)
您可以通过以下方式获得刷新的“B”值:
$a->getRelated('B',true)->doSomething();
第二个参数“true”要求yii从数据库重新加载关系。
答案 2 :(得分:6)
在Yii2中它只是一个简单的
unset($model->relation);
所以在这种情况下unset($a->b)
答案 3 :(得分:0)
据我所知,当在A模型中声明关系B时,当你调用$ a-> B时,对象B正从数据库中“延迟加载”。除非它被缓存(默认情况下我不认为),每次调用这种关系时都应该抓取B的新副本。
我会确保如果doSomething()正在更改B中的数据,你也可以在B-> doSomething()中调用$ this-> save()。如果您要更改B但未保存更改,那么当您再次查询B时,它将具有相同的旧内容。
<?php
function doSomething() {
$this->my_data++; // change something
$this->save(); // save the changes
}
?>
如果您想在更改后再次访问B ,但在保存它之前,则需要在A中的变量中将其设置为“缓存”它,排序。否则,因为当您调用$ a-&gt; 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事务(通过Yii的CDbTransaction)确保数据完整性。
如果这一切都不起作用,也许做一个“急切”的负载也会解决你的问题,如下:
<?php
$posts=A::model()->with('B')->findAll();
?>
答案 4 :(得分:0)
$ a-&gt; B-&gt; refresh(); //仅刷新B
$ a-&gt; refresh(); //刷新a和所有自然的所有关系,包括“B”