2011-06-14 14 views
6

में रिलेशनल फिक्स्चर मैं वाईआई में रिश्तों के साथ जुड़नार कैसे स्थापित करूं? उदाहरण के लिए, पोस्ट के साथ टिप्पणियां हो सकती हैं, मैं टिप्पणी बनाने के लिए एक स्थिरता में पोस्ट आईडी का संदर्भ कैसे ले सकता हूं?वाईआई

पोस्ट स्थिरता:

return array(
    'post1'=>array(
    'title'=>'My title', 
    'body'=>'My text', 
), 
    ... 

टिप्पणी स्थिरता:

return array(
    'comment1'=>array(
    'text'=>'Comment text...', 
    'post_id'=> ??? 
), 
+0

क्या हम यहाँ संबंधपरक प्रश्नों के बारे में बात कर रहे हैं? –

+0

वास्तव में नहीं? मैं केवल फिक्स्चर (यूनिट परीक्षण के लिए) बनाना चाहता हूं जिसमें उत्पादन प्रणाली में रिश्तों की तरह संबंध हों। –

+0

मेरा बुरा। मैं इसे देखूँगा महोदय। –

उत्तर

5

मुझे लगता है कि ऐसा करने के लिए एक गतिशील तरीका है कि क्या वहाँ पता नहीं है, लेकिन अगले काम करना चाहिए:

पोस्ट स्थिरता:

return array(
    'post1' => array(
    'id' => 1 
    'title' => 'My title', 
    'body' => 'My text', 
), 

टिप्पणी स्थिरता:

return array(
    'comment1' => array(
    'text' => 'Comment text...', 
    'post_id' => 1 
), 
+0

मामले में किसी को भी सोच रहा है, यह वास्तव में काम करता है - ** प्रलेखन उल्लेख '' 'id''' क्षेत्रों गतिशील रूप से उत्पन्न किया जा रहा है, और उन्हें स्थापित करने के लिए नहीं बताते हुए के बावजूद।** –

+0

जिस क्रम में फिक्स्चर लोड किए गए हैं, उसके द्वारा निर्धारित किया जाता है जिसमें php readdir कमांड स्थिरता फ़ाइलों को सूचीबद्ध करता है, * अस्थायी रूप से विदेशी कुंजी बाधाओं को अक्षम करना * आवश्यक हो सकता है। – clapas

4

जहां तक ​​मैं बाहर काम किया है, तो आप शास्त्रीय जुड़नार के बजाय init स्क्रिप्ट का उपयोग कर सकते हैं। Yii documentation पढ़ता है:

यह भी संभव है कि हम एक तालिका को रीसेट, जैसे कि, यह छोटा और स्थिरता डेटा के साथ डालने के डिफ़ॉल्ट तरीका पसंद नहीं है। यदि यह मामला है, हम विशिष्ट स्थिरता फ़ाइल के लिए एक आरंभीकरण स्क्रिप्ट लिख सकते हैं। स्क्रिप्ट को तालिका नाम के रूप में नामित किया जाना चाहिए .init.php के साथ प्रत्यय। उदाहरण के लिए, के लिए प्रारंभिक स्क्रिप्ट पोस्ट तालिका Post.init.php होगी। जब CDbFixtureManager इस स्क्रिप्ट को देखता है, तो यह तालिका को रीसेट करने के लिए डिफ़ॉल्ट तरीके का उपयोग करने के बजाय इस स्क्रिप्ट को निष्पादित करेगा।

तो आपके मामले में, बजाय protected/tests/fixtures/Comment.php होने के, आप protected/tests/fixtures/Comment.init.php जो ऐसा करता होगा:

// the $this variable refers to the CBdFixtureManager instance 
$this->truncateTable($tableName); 
$post = $this->getRecord('Post','post1'); // get dependent fixture 

// define new fixture 
$commentAttributes = array(
    'text' => 'Comment text...', 
    'post_id' => $post->id 
); 
$comment = new Comment; 
$comment->setAttributes($commentAttributes); 
if(!$comment->save()) throw new CException('Unable to save fixture'); 

// add new row primary key 
$pk = Comment::model()->getTableSchema()->primaryKey; 
if(is_string($pk)) 
    $commentAttributes[$pk] = $comment->$pk; 
elseif(is_array($pk)) 
    foreach($pk as $key) 
    $commentAttributes[$key] = $comment->$key; 

$this->_rows['Comment']['comment1'] = $commentAttributes; 
$this->_records['Comment']['comment1'] = 'Comment'; 

हालांकि मुझे पता है यह एक बहुत देर से उत्तर, कि आपकी समस्या का समाधान करना चाहिए। चूंकि मैं यहां जा रहा हूं, मैं उम्मीद कर रहा था कि मैं किसी और की मदद कर सकता हूं जिसकी इस जानकारी की आवश्यकता है।

+0

आपके उत्तर के लिए धन्यवाद, समय देरी के साथ भी! मुझे उम्मीद है कि यह भविष्य में किसी की मदद करेगा। –

2

मुझे पता है कि यह पहले से ही उत्तर दिया गया है लेकिन मुझे लगता है कि यह एक बेहतर जवाब है। हाँ, आप संबंधों के लिए डायनामिक फ़ील्ड का उपयोग कर सकते हैं:

पोस्ट स्थिरता:

return array(
    'post1' => array(
    'title' => 'My title', 
    'body' => 'My text', 
), 

टिप्पणी स्थिरता:

return array(
    'comment1' => array(
    'text' => 'Comment text...', 
    'post_id' => $this->getRecord('post', 'post1')->id 
), 

PostTest.php

public $fixtures=array(
    'post'=>'Post', 
    ... 
); 

Yii डॉक्स CDbFixtureManager

+0

मैंने कोशिश की लेकिन यह काम नहीं किया, क्या मुझे बूटस्ट्रैप या कॉन्फ़िगरेशन पर कुछ अलग करना है? CdbFixtureManager में _records हमेशा मेरे लिए शून्य है – FabioCosta

+0

"_records" क्या है? क्या यह हार्डकोड आईडी के साथ काम करता है? यदि नहीं, तो यह मेरे उत्तर से संबंधित नहीं है और आपको परीक्षण और फिक्स्चर बनाने में सहायता लेनी चाहिए। युक्ति: मुझे लगता है कि $ स्थिरता सरणी में ऑर्डर महत्वपूर्ण है, इसलिए सुनिश्चित करें कि मास्टर टेबल पहले शामिल है (यहां 'पोस्ट' $ जुड़नार में पहला तत्व है, फिर 'टिप्पणी' का पालन करना चाहिए)। – kcsoft

+0

हार्डकोडेड आईडी का उपयोग करते समय एक के अलावा कोई अन्य कॉन्फ़िगरेशन आवश्यक नहीं है। मेरा अनुमान है कि आपने कुछ गलत वर्तनी की है। उदाहरण के लिए cdbFixtureManager में कोई "getRecords" विधि नहीं है। इसमें "getRecord" है और इसे ActiveRecord ऑब्जेक्ट वापस करना चाहिए। हो सकता है कि आपने आईडी प्राप्त करने के लिए "-> आईडी" का उपयोग किया हो लेकिन यह आपके मॉडल से आईडी से मेल खाना चाहिए। – kcsoft