Mysql
 sql >> Database >  >> RDS >> Mysql

Chiave esterna multipla alla stessa tabella Gas Orm

Non so se questo argomento è ancora aggiornato e interessante per alcuni di voi, ma in generale ho avuto lo stesso identico problema.

Ho deciso che Gas ORM sarebbe stato il mio mappatore in combinazione con CodeIgniter. Poiché la struttura del mio database era stata fornita e non seguiva la convenzione table_pk di Gas, ho dovuto definire una chiave esterna da solo che farà riferimento alla mia chiave esterna del database personalizzato. Tuttavia, la definizione di esso non ha avuto alcun impatto. Come il tuo errore sopra, il mappatore non è stato in grado di creare l'istruzione SQL corretta. La dichiarazione era simile alla tua:

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

Bene, sembra che Gas ignori le chiavi esterne autodefinite e tenti di utilizzare la convenzione table_pk predefinita. Ciò significa che prende la tabella (nel tuo caso:pool) e la chiave primaria (id) unendola con un carattere di sottolineatura.

Ho capito che il costruttore di orm.php gestisce ogni chiave primaria ed esterna definita all'interno delle entità. Nella riga 191, il codice chiama una clausola if combinata con empty funzione di php. Poiché la chiave primaria è sempre definita e non c'è negazione nell'istruzione, salta ogni volta la parte interna della clausola. Tuttavia, la parte interna si occupa delle chiavi esterne autodefinite.

Per farla breve, ho aggiunto una negazione (!) nella riga 191 di orm.php che mi porta al seguente codice:

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;
                }
            }
        }
    }

Bene, questa piccola soluzione mi ha aiutato molto e spero che anche alcuni di voi possano trarre vantaggio da questo suggerimento.