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

时间:2010-07-14 04:32:20

标签: model yii

假设我的模型A与B有关。

当我写:

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

现在可以更改B(例如,由其他用户更改)。我写的时候:

$a->B->doSomething(); 

它使用B的旧值。在doSomething()之前,我应该强制刷新B的值。

5 个答案:

答案 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”