Model 如何强制刷新yii中的模型值
假设模型A与B有关 当我写作时:Model 如何强制刷新yii中的模型值,model,yii,Model,Yii,假设模型A与B有关 当我写作时: $a = A::model()->findByPK(1); $a->B->doSomething(); $a->B->doSomething(); 现在B可能会被更改(例如由其他用户更改)。当我写作时: $a = A::model()->findByPK(1); $a->B->doSomething(); $a->B->doSomething(); 它使用了B的旧值。我应该做的是在doSom
$a = A::model()->findByPK(1);
$a->B->doSomething();
$a->B->doSomething();
现在B可能会被更改(例如由其他用户更改)。当我写作时:
$a = A::model()->findByPK(1);
$a->B->doSomething();
$a->B->doSomething();
它使用了B的旧值。我应该做的是在doSomething()之前强制刷新B的值。据我所知,当关系B在A的模型中声明时,当调用$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之后但在保存B之前再次访问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事务(通过Yii的CDbTransaction)来确保数据的完整性
如果这些都不起作用,那么进行“急切”加载也可以解决您的问题,如下所示:
<?php
$posts=A::model()->with('B')->findAll();
?>
Yii提供了一个refresh()方法,我想这就是你想要的
您可以通过以下方式获得刷新的“B”值:
$a->getRelated('B',true)->doSomething();
第二个参数“true”要求yii从数据库重新加载关系。在Yii2中,这只是一个简单的过程
unset($model->relation);
因此,在本例中,unset($a->b)
$a->b->refresh();//只刷新B
$a->refresh();//刷新a和包括“B”在内的所有关系