2010-07-14 14 views
8

में मॉडल के मूल्य को ताज़ा करने के लिए मजबूर करने का कहते हैं कि मैं जब मैं लिखने बीकैसे Yii

के संबंध के साथ मॉडल एक डालते हैं:

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

और अब बी बदल द्वारा हो सकता है (अन्य उपयोगकर्ता द्वारा के लिए उदाहरण)। जब मैं लिख:

$a->B->doSomething(); 

यह बी के पुराने मूल्यों का उपयोग करता क्या मैं DoSomething से पहले बी के मूल्य को ताज़ा करने के लिए मजबूर करने के लिए क्या करना चाहिए()।

उत्तर

0

जैसा कि मैं समझता हूं कि रिश्ते बी को ए के मॉडल में घोषित किया जाता है, जब आप ए-> बी कहते हैं तो ऑब्जेक्ट बी डेटाबेस से "आलसी लोड" होता जा रहा है। जब तक इसे कैश नहीं किया जाता है (जो डिफ़ॉल्ट रूप से ऐसा नहीं करता है, मुझे नहीं लगता) यह हर बार जब आप उस रिश्ते को बुलाते हैं तो बी की ताजा प्रतिलिपि लेना चाहिए।

मैं यह सुनिश्चित कर दूंगा कि यदि कुछ कुछ() बी में डेटा बदल रहा है तो आप बी-> 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(); 
?> 
+0

वाईआई संबंधों को कैश करता है। –

10

आप कह रही द्वारा एक ताजा 'बी' मूल्य प्राप्त कर सकते हैं:

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

2 परम "सही" पूछता है कि Yii डेटाबेस से संबंध से लोड करें।

4

Yii2 में इसकी सिर्फ एक सरल

unset($model->relation); 
इसलिए इस मामले में

unset($a->b)

0

$ a-> बी> ताज़ा(); // केवल बी ताज़ा करने के लिए

$ एक करने के लिए > रीफ्रेश(); // को रीफ्रेश करने के लिए और सभी स्वाभाविक रूप से सभी संबंध "बी"