模型的价值,让我们说,我有模式A和关系B.如何强制刷新在警予
当我写:
$a = A::model()->findByPK(1);
$a->B->doSomething();
,现在可以通过改变B(由其他用户为实例)。当我写:
$a->B->doSomething();
它使用旧值B.我应该做什么来强制刷新B值doSomething()之前。
模型的价值,让我们说,我有模式A和关系B.如何强制刷新在警予
当我写:
$a = A::model()->findByPK(1);
$a->B->doSomething();
,现在可以通过改变B(由其他用户为实例)。当我写:
$a->B->doSomething();
它使用旧值B.我应该做什么来强制刷新B值doSomething()之前。
Yii提供刷新()方法,我认为是你想找的?
http://www.yiiframework.com/doc/api/CActiveRecord#refresh-detail
据我所知,当在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-> 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();
?>
你可以这样得到刷新“B”值:
$a->getRelated('B',true)->doSomething();
第二届参数“真”恳请警予重新从数据库中的关系。
在Yii2其只是一个简单的
unset($model->relation);
所以在这种情况下unset($a->b)
$ A-> B->刷新(); //仅刷新乙
$ A- > refresh(); //刷新一个和所有关系,包括“B”
Yii执行缓存关系。 – 2013-03-13 22:24:47