模型的價值,讓我們說,我有模式A和關係B.如何強制刷新在警予
當我寫:
$a = A::model()->findByPK(1);
$a->B->doSomething();
,現在可以通過改變B(由其他用戶爲實例)。當我寫:
$a->B->doSomething();
它使用舊值B.我應該做什麼來強制刷新B值doSomething()之前。
模型的價值,讓我們說,我有模式A和關係B.如何強制刷新在警予
當我寫:
$a = A::model()->findByPK(1);
$a->B->doSomething();
,現在可以通過改變B(由其他用戶爲實例)。當我寫:
$a->B->doSomething();
它使用舊值B.我應該做什麼來強制刷新B值doSomething()之前。
Yii提供刷新()方法,我認爲是你想找的?
http://www.yiiframework.com/doc/api/CActiveRecord#refresh-detail
據我所知,當在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();
?>
你可以這樣得到刷新「B」值:
$a->getRelated('B',true)->doSomething();
第二屆參數「真」懇請警予重新從數據庫中的關係。
在Yii2其只是一個簡單的
unset($model->relation);
所以在這種情況下unset($a->b)
$ A-> B->刷新(); //僅刷新乙
$ A- > refresh(); //刷新一個和所有關係,包括「B」
Yii執行緩存關係。 – 2013-03-13 22:24:47