Mysql
 sql >> Base de données >  >> RDS >> Mysql

Plusieurs clés étrangères vers la même table Gas Orm

Je ne sais pas si ce sujet est toujours d'actualité et intéressant pour certains d'entre vous, mais en général, j'ai eu exactement le même problème.

J'ai décidé que Gas ORM serait mon mappeur en combinaison avec CodeIgniter. Comme ma structure de base de données était donnée et qu'elle ne suivait pas la convention table_pk de Gas, j'ai dû définir une clé étrangère par moi-même qui fera référence à ma clé étrangère de base de données personnalisée. Cependant, sa définition n'avait aucune incidence sur quoi que ce soit. Comme votre erreur ci-dessus, le mappeur n'a pas été en mesure de créer la bonne instruction SQL. La déclaration ressemblait à la vôtre :

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

Eh bien, il semble que Gas ignore les clés étrangères auto-définies et essaie d'utiliser la convention table_pk par défaut. Cela signifie qu'il prend la table (dans votre cas :pool) et la clé primaire (id) en la fusionnant avec un caractère de soulignement.

J'ai compris que le constructeur de orm.php gère chaque clé primaire et étrangère définie dans les entités. À la ligne 191, le code appelle une clause if combinée avec le empty fonction de php. Comme la clé primaire est toujours définie et qu'il n'y a pas de négation dans l'instruction, elle saute la partie interne de la clause à chaque fois. Cependant, la partie interne s'occupe des clés étrangères auto-définies.

Pour faire court, j'ai ajouté une négation (!) à la ligne 191 de orm.php qui m'amène au code suivant :

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

Eh bien, ce petit correctif m'a beaucoup aidé et j'espère que certains d'entre vous pourront également profiter de cet indice.