Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Várias chaves estrangeiras para a mesma mesa Gas Orm


Não sei se este tópico ainda está atualizado e interessante para alguns de vocês, mas em geral, tive exatamente o mesmo problema.

Decidi que o Gas ORM seria meu mapeador em combinação com o CodeIgniter. Como minha estrutura de banco de dados foi dada e não estava seguindo a convenção table_pk do Gas, tive que definir uma chave estrangeira por mim mesmo, que deve se referir à minha chave estrangeira do banco de dados personalizado. No entanto, a definição disso não teve impacto em nada. Como seu erro acima, o mapeador não conseguiu construir a instrução SQL correta. A declaração ficou parecida com a sua:
   SELECT * FROM partner WHERE partner.pool_id IN (1)

Bem, parece que o Gas ignora as chaves estrangeiras autodefinidas e tenta usar a convenção table_pk padrão. Isso significa que ele pega a tabela (no seu caso:pool) e a chave primária (id) mesclando-a com um caractere de sublinhado.

Eu descobri que o construtor de orm.php lida com todas as chaves primárias e estrangeiras definidas nas entidades. Na linha 191, o código chama uma cláusula if combinada com o empty função do php. Como a chave primária é definida sempre e não há negação na instrução, ela pula a parte interna da cláusula todas as vezes. No entanto, a parte interna cuida das chaves estrangeiras autodefinidas.

Para encurtar a história, adicionei uma negação (!) na linha 191 do orm.php que me leva ao seguinte 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;
                }
            }
        }
    }

Bem, essa pequena correção me ajudou muito e espero que alguns de vocês possam aproveitar essa dica também.