Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

केकेपीएचपी:नई एचएबीटीएम पंक्ति बनाना इसके बजाय अन्य अपडेट करता है

ठीक है, मैं यह रहा सोचता हूं हो रहा है:

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

यह ठीक है जब आपके पास एक जटिल HABTM तालिका हो। लेकिन अगर ऐसा है, तो आपकी डेटा सरणी पूरी तरह से गड़बड़ हो गई है, क्योंकि आप Question नहीं जोड़ रहे हैं और Qset अलग से। मेरा मतलब है, आप नहीं कर रहे हैं

$data = array('Question'=>array('title'=>'new_question'),
              'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);

ऐसा करने से, आप केक को अपने लिए एचएबीटीएम एसोसिएशन को हल करने देते हैं, और वह डेटा संरचना ठीक रहेगी। लेकिन आपके पास मॉडल फ़ोल्डर में आपका अपना QsetsQuestion मॉडल है। तो आपके द्वारा सहेजा गया डेटा किसी अन्य तालिका की तरह होना चाहिए, जैसे

$data = array('qset_id'=> $qset_id,
              'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);

और यह qsets_questions तालिका में एक नई आईडी बनाता है, नए संबंध के साथ, जैसा आप चाहते हैं।

सावधान रहें, हालांकि, इसके लिए आप अपने स्वयं के मॉडल का उपयोग कर रहे हैं, यदि आप सत्यापन को सही तरीके से सेट नहीं करते हैं, तो आपके पास विदेशी कुंजियों की एक ही जोड़ी कई बार हो सकती है, क्योंकि डिफ़ॉल्ट रूप से केक केवल यह जांचता है कि आईडी अद्वितीय होनी चाहिए ।

[संपादित करें] कुछ स्पष्टीकरण के बाद, उपरोक्त समाधान "समस्या" का समाधान करता है, लेकिन वास्तव में इस व्यवहार का कारण नहीं है।

केकफ़्पी में एक सुविधा

इसलिए जब आप एक नई पंक्ति जोड़ना चाहते हैं, तो केक सभी पिछले संघों को हटा देता है और नए जोड़ देता है। इसे हल करने का एक तरीका सभी Qsets . को ढूंढना है जो किसी प्रश्न से संबंधित हों और उन्हें $data . में जोड़ें सरणी (नए प्रश्न संघ को जोड़ने के साथ जिसे आप जोड़ना चाहते हैं)। यह लिंक एचएबीटीएम संघों को समझने में मेरी मदद की ("चैलेंज IV" देखें)।

मुझे पता है कि मैंने पहले जो समाधान दिया था, उससे आपको "समस्या" में मदद मिली, लेकिन यह इस धारणा के तहत बनाया गया था कि आपके पास QsetsQuestion है मॉडल फ़ाइल कहीं। चूंकि आप नहीं करते हैं, इसका समाधान सभी Question प्राप्त करना होगा संबद्ध और उन्हें एक नई सरणी के रूप में जोड़ें। या वास्तव में एक QsetsQuestion बनाएं मॉडल, और संघों को इस तरह बनाएं:

Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.

या केक का व्यवहार बदलो... उनमें से कोई भी सुंदर नहीं लगता, मुझे पता है।

तो, समाधान के लिए सारांश:

  • हर बार जब आप एक नया Qset-Question एसोसिएशन सहेजना चाहते हैं, पहले से संग्रहीत संघों को पुनः प्राप्त करें, इसे सहेजने के लिए सरणी में रखें, और उन्हें सहेजें

    //find previously associated Qsets, lets say it's 1,2,3 and 4
    $data = array('Question'=>array('id'=>1),
              'Qsets'=>array('Qsets'=>array(1,2,3,4, $new_qset));
    $this->Question-save($data);
    

ध्यान दें कि कोई QsetsQuestion नहीं है , क्योंकि यह मौजूद नहीं है। यह पहला विकल्प होना चाहिए क्योंकि एचएबीटीएम मॉडल जटिल नहीं है

या

  • QsetsQuestion बनाएं अपने मॉडल फ़ोल्डर में और ऊपर बताए अनुसार संघों को बदलें। कंट्रोलर पर सेव पार्ट होगा

    $data = array('qset_id'=>1, 'question_id'=>1)
    $this->Question->QsetsQuestion->save($data);    //also works with $this->Qset->QsetsQuestion
    

यह बहुत अधिक सरल है (हो सकता है), लेकिन आपको एक नई फ़ाइल बनानी होगी, और यह जांचना याद रखें कि कोई पिछली समान संबद्धता नहीं है (जांचें कि क्या 2-2 टपल इसे सम्मिलित करने से पहले मौजूद है)। साधारण सत्यापन नियम काम करने चाहिए।

या

  • इसके लिए केकफ़्पी व्यवहार बदलें... मुझे यह पसंद नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQLdb का उपयोग करके पंक्तियों को जोड़ने वाला 'इन्सर्ट' फ़ंक्शन क्यों नहीं है?

  2. यदि तालिका मौजूद नहीं है तो एक लंबी क्वेरी निष्पादित करें

  3. MySQL केवल IN () समकक्ष खंड

  4. अमान्य सिंटैक्स त्रुटि प्रकार =हाइबरनेट द्वारा उत्पन्न डीडीएल में MyISAM

  5. PHP mysqli के साथ MySQL में मान कैसे बढ़ाएं?