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

एक ही टेबल गैस Orm . के लिए एकाधिक विदेशी कुंजी

मुझे नहीं पता, अगर यह विषय अभी भी अप टू डेट है और आप में से कुछ के लिए दिलचस्प है, लेकिन सामान्य तौर पर, मुझे ठीक यही समस्या थी।

मैंने कोडइग्निटर के साथ संयोजन में गैस ओआरएम को अपना मैपर बनाने का फैसला किया। चूंकि मेरी डेटाबेस संरचना दी गई थी और यह गैस के table_pk सम्मेलन का पालन नहीं कर रही थी, मुझे एक विदेशी कुंजी परिभाषित करनी पड़ी मेरे द्वारा जो मेरे कस्टम डेटाबेस विदेशी कुंजी को संदर्भित करेगा। हालाँकि, इसकी परिभाषा का किसी भी चीज़ पर कोई प्रभाव नहीं पड़ा। उपरोक्त आपकी त्रुटि की तरह, मैपर सही SQL-कथन बनाने में सक्षम नहीं था। बयान आपके जैसा लग रहा था:

   SELECT * FROM partner WHERE partner.pool_id IN (1)

ठीक है, ऐसा लगता है जैसे गैस स्वयं परिभाषित विदेशी कुंजी को अनदेखा करती है और डिफ़ॉल्ट table_pk सम्मेलन का उपयोग करने का प्रयास करती है। इसका मतलब है, यह तालिका (आपके मामले में:पूल) और प्राथमिक कुंजी (आईडी) को अंडरस्कोर वर्ण के साथ विलय करके लेता है।

मुझे पता चला, कि orm.php . का निर्माता संस्थाओं के भीतर परिभाषित प्रत्येक प्राथमिक और विदेशी कुंजी को संभालता है। पंक्ति 191 में, कोड एक if खंड को खाली के साथ कॉल करता है। पीएचपी का कार्य चूंकि प्राथमिक कुंजी को हमेशा परिभाषित किया जाता है और कथन में कोई निषेध नहीं होता है, यह हर बार खंड के आंतरिक भाग को छोड़ देता है। हालाँकि, आंतरिक भाग स्व-परिभाषित विदेशी कुंजियों का ध्यान रखता है।

लंबी कहानी छोटी, मैंने एक निषेध जोड़ा (!) orm.php की पंक्ति 191 में जो मुझे निम्नलिखित कोड की ओर ले जाता है:

if ( ! empty($this->primary_key))
    {
        if ( ! empty($this->foreign_key))
        {
            // Validate foreign keys for consistency naming convention recognizer
            $foreign_key = array();

            foreach($this->foreign_key as $namespace => $fk)
            {
                $foreign_key[strtolower($namespace)] = $fk;
            }

            $this->foreign_key = $foreign_key;
        }
        else
        {
            // If so far we didnt have any keys yet, 
            // then hopefully someone is really follow Gas convention
            // while he define his entity relationship (yes, YOU!)
            foreach ($this->meta->get('entities') as $name => $entity)
            {
                if ($entity['type'] == 'belongs_to')
                {
                    $child_name     = $entity['child'];
                    $child_instance = new $child_name;
                    $child_table    = $child_instance->table;
                    $child_key      = $child_instance->primary_key;

                    $this->foreign_key[strtolower($child_name)] = $child_table.'_'.$child_key;
                }
            }
        }
    }

खैर, इस छोटे से सुधार ने मेरी बहुत मदद की और मुझे आशा है कि आप में से कुछ लोग इस संकेत का भी लाभ उठा सकते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mySQL रेगेक्स जहां क्लॉज में है

  2. MySQL के साथ एक खाली फ़ील्ड की जाँच कर रहा है

  3. Mysql_real_escape_string() सर्वर का लिंक स्थापित नहीं किया जा सका

  4. IN खंड में MySQL एकाधिक कॉलम

  5. ओवरलैपिंग बुकिंग क्वेरी