2011-01-13 18 views
6

मान लीजिए मेरे पास समान संरचना वाले 2 समान तालिका हैं (इसे 'टेबल ए' पर कॉल करें & 'tableB')।CAKEPHP में हम गतिशील रूप से किसी विशेष मॉडल से जुड़े तालिका को बदल सकते हैं?

मैं तालिका 'ए' पर कुछ डेटा और तालिका 'बी' पर कुछ डेटा सहेजना चाहता हूं।

अब मैं दोनों तालिका के लिए एक ही मॉडल का उपयोग करना चाहता हूं।

मैं नियंत्रक पर स्थिति के आधार पर गतिशील रूप से बदलने के लिए मॉडल से जुड़े तालिका को बदलना चाहता हूं ('मॉडलएम' कहें)।

उदा।


नियंत्रक में: - // नमूना कोड

function saveProduct(){ 

    $this->loadModel('ModelM'); 

    if(condition){ 

     $this->ModelM->useTable = 'A'; 

    }else{ 

     $this->ModelM->useTable = 'B'; 

    } 
    $this->ModelM->save($this->data); 

} 

14 वीं जनवरी 2011

निम्नलिखित पर अलावा कोड की कॉपी/पेस्ट मैं पर काम कर रहा हूँ है :

function experiment(){ 

    $tableName = 'temp_table'.'1234'; 

    mysql_query('CREATE TABLE '.$tableName.' LIKE temp_home_masters'); 

    $sql = $this->createInsertQuery($new_arr,$tableName); 

    $status = mysql_query($sql); 

    if($status){ 
     echo "saved successfully"; 
    }else{ 
     echo "error"; 
    } 

    $this->NewHomeMaster->setSource($tableName);//NewHomeMaster was previously attached to a different table , here I want to change the tableName the model linked with dynamically.Model 'NewHomeMaster' already exists and uses a table ...Here I am willing to link this model to the newly created tempory table.// 

    $home_details=$this->paginate('NewHomeMaster',array($new_conditions)); 

    mysql_query('DROP table '.$tableName); 

} 

दुर्भाग्य से यह काम नहीं करता है ...

उत्तर

3

मैं मूल रूप से बाहर सेट अपने समस्या का समाधान निकालने की है, लेकिन अधिक मैं इसके बारे में सोचो, मेरा मानना ​​है कि अपने तर्क त्रुटिपूर्ण है।

मैं देख सकता हूं कि सारणी समान या समान हैं, यह तथ्य दोनों टेबलों के साथ बातचीत करने के लिए एक मॉडल का उपयोग करने के निर्णय के लिए आपको ले जा सकता है। हालांकि, जब आप एक मॉडल को क्या देखते हैं (केकपीएचपी में मूल रूप से एक टेबल के लिए एक इंटरफेस), यह आगे और पीछे स्विच करने के लिए समझ में नहीं आता है।

CakePHP डॉक्स इस तरह के मॉडल की व्याख्या:

में वस्तु उन्मुख एक डाटा मॉडल प्रोग्रामिंग एक उद्देश्य यह है कि, एक "बात" का प्रतिनिधित्व करता है एक कार, एक व्यक्ति, या एक घर की तरह है।

आपके उदाहरण में, आपके पास वास्तव में दो अलग-अलग "चीजें" हैं जो बिल्कुल वही दिखती हैं। इसलिए, उनके पास अपने मॉडल होना चाहिए।

अपने मॉडल वास्तव में ठीक उसी तरीकों करने जा रहे हैं, तो "CakePHP तरीका" एक कस्टम Behavior कि अपने साझा तरीकों समाहित परिभाषित करने के लिए किया जाएगा। फिर दोनों मॉडलों के व्यवहार को संलग्न करें।

तो फिर तुम मॉडल आप नियंत्रक हालत में जरूरत लोड कर सकते हैं:

private $DynamicModel; 

public function saveProduct() { 
    if (condition) { 
     App::import('Model', 'ModelZ'); 
     $this->DynamicModel = new ModelZ; 
    } else { 
     App::import('Model', 'ModelY'); 
     $this->DynamicModel = new ModelY; 
    } 
    $this->DynamicModel->save($this->data); 
} 
+0

मेरे समस्या थोड़ी अलग है, मैं सिर्फ एक उदाहरण देकर यह समझाया था ... मैं एक यादृच्छिक मेज गतिशील रूप से (एक मौजूदा तालिका के सटीक प्रतिकृति) avg_price बनाने के लिए, कुछ जटिल गणना कर (चाहते हैं) और फिर मौजूदा तालिका को इस नए टेबल में कॉपी करें, इसके साथ 1 नया कॉलम जोड़ने के साथ 'avg_price' ... अब मैं 'avg_price' फ़ील्ड में 'ऑर्डर बाय' का उपयोग करके इस गतिशील रूप से बनाई गई तालिका को पगेट करना चाहता हूं ... पेजिंग के बाद मैं टेबल छोड़ दूंगा .... – Libu

+0

इसलिए प्रत्येक बार जब मैं स्क्रिप्ट चलाता हूं तो एक टेबल बनाई जाएगी-> गणना-> पुरानी तालिका को गणना की गई फ़ील्ड के साथ नई तालिका में कॉपी करें-> नई तालिका को पेजेट करें और डेटा सेट करें देखने के लिए-> तालिका ड्रॉप करें .... – Libu

+0

क्या हम फ्लाई और एसीआई पर टेम्पलेटरी टेबल बना सकते हैं जीएन मॉडल यह करने के लिए ?? – Libu

0

स्थिति, मुश्किल है के रूप में स्टीफन यह वर्णन करता है, क्योंकि अपने दृष्टिकोण को कुछ हद तक MVC सम्मेलनों का उल्लंघन करती है।

हालांकि, यदि आप कस्टम हैक्स के अंधेरे पक्ष में जाने के इच्छुक हैं, तो आप केकेपीएचपी में अपना पसंदीदा डेटासोर्स बनाने पर विचार कर सकते हैं जो आपके लिए इस तरह के तर्क को संभालता है। एक विकल्प है कि किसी दिए गए डेटासोर्स (संभवतः MySQL एक) को अपने कस्टम तर्क के साथ विस्तारित करना है जिसका उद्देश्य डेटाबेस के साथ बातचीत करने से पहले कुछ प्रारंभिक फ़िल्टरिंग/कंडीशनिंग करना है।यह साफ नहीं है क्योंकि तर्क गलत दायरे में रखा गया है, लेकिन काम कर सकता है। शुरुआत के लिए यहां देखें: http://book.cakephp.org/view/1075/DataSources

वैकल्पिक रूप से, आप दो अलग-अलग मॉडल बना सकते हैं और उन्हें एक व्यवहार का उपयोग करके एक ही तर्क साझा कर सकते हैं। इस प्रकार आपको प्रवाह में पहले मॉडल की पसंद लेने के लिए सीमित कर देता है (और इस प्रकार न केवल डेटा स्टोरेज के स्थान को प्रभावित करता है), लेकिन यह संभावना हो सकती है।

+0

एक डेटास्रोत दिलचस्प होगा, लेकिन वास्तव में अंधेरा! – Stephen

संबंधित मुद्दे