जैसा कि मैं समझता हूं कि रिश्ते बी को ए के मॉडल में घोषित किया जाता है, जब आप ए-> बी कहते हैं तो ऑब्जेक्ट बी डेटाबेस से "आलसी लोड" होता जा रहा है। जब तक इसे कैश नहीं किया जाता है (जो डिफ़ॉल्ट रूप से ऐसा नहीं करता है, मुझे नहीं लगता) यह हर बार जब आप उस रिश्ते को बुलाते हैं तो बी की ताजा प्रतिलिपि लेना चाहिए।
मैं यह सुनिश्चित कर दूंगा कि यदि कुछ कुछ() बी में डेटा बदल रहा है तो आप बी-> doSomething() के अंदर यह-> save() भी कॉल करते हैं। यदि आप बी बदल रहे हैं लेकिन परिवर्तनों को सहेज नहीं रहे हैं तो जब आप बी के लिए पूछते हैं तो यह वही पुरानी सामग्री होगी।
<?php
function doSomething() {
$this->my_data++; // change something
$this->save(); // save the changes
}
?>
आप फिर से बी का उपयोग करने की चाहते के बाद आप इसे बदल दिया है लेकिन इससे पहले कि आप बचाया है, तो आप इसे, एक तरह से "कैश" इसे करने के लिए एक में एक चर में निर्धारित करने की आवश्यकता होगी। अन्यथा, जब आप $ a-> बी कहते हैं तो डेटाबेस से ताजा प्रति प्राप्त हो रही है (और आपने 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();
?>
वाईआई संबंधों को कैश करता है। –