sql >> Base de Datos >  >> RDS >> Mysql

Múltiples claves foráneas a la misma tabla Gas Orm

No sé si este tema todavía está actualizado e interesante para algunos de ustedes, pero en general, tuve exactamente el mismo problema.

Decidí que Gas ORM fuera mi mapeador en combinación con CodeIgniter. Como se proporcionó la estructura de mi base de datos y no seguía la convención table_pk de Gas, tuve que definir una clave externa por mí mismo, que se referirá a mi clave externa de base de datos personalizada. Sin embargo, la definición de la misma no tuvo ningún impacto en nada. Al igual que su error anterior, el mapeador no pudo generar la instrucción SQL correcta. La declaración se parecía a la suya:

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

Bueno, parece que Gas ignora las claves foráneas autodefinidas e intenta usar la convención table_pk predeterminada. Esto significa que toma la tabla (en su caso:grupo) y la clave principal (id) fusionándola con un carácter de subrayado.

Descubrí que el constructor de orm.php maneja todas las claves primarias y externas definidas dentro de las entidades. En la línea 191, el código llama a una cláusula if combinada con empty función de php. Como la clave principal se define siempre y no hay negación en la declaración, se salta la parte interna de la cláusula cada vez. Sin embargo, la parte interna se encarga de las claves foráneas autodefinidas.

Para resumir, agregué una negación (!) en la línea 191 de orm.php que me lleva al siguiente código:

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

Bueno, esta pequeña solución me ayudó mucho y espero que algunos de ustedes también puedan aprovechar esta sugerencia.