Model 如何强制刷新yii中的模型值

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与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的旧值。我应该做的是在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”在内的所有关系