2010-07-14 89 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」