2010-07-14 88 views
8

模型的价值,让我们说,我有模式A和关系B.如何强制刷新在警予

当我写:

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

,现在可以通过改变B(由其他用户为实例)。当我写:

$a->B->doSomething(); 

它使用旧值B.我应该做什么来强制刷新B值doSomething()之前。

回答

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-> 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(); 
?> 
+0

Yii执行缓存关系。 – 2013-03-13 22:24:47

10

你可以这样得到刷新“B”值:

$a->getRelated('B',true)->doSomething(); 

第二届参数“真”恳请警予重新从数据库中的关系。

4

在Yii2其只是一个简单的

unset($model->relation); 

所以在这种情况下unset($a->b)

0

$ A-> B->刷新(); //仅刷新乙

$ A- > refresh(); //刷新一个和所有关系,包括“B”