sql >> Databasteknik >  >> RDS >> Mysql

Flera främmande nyckel till samma tabell Gas Orm

Jag vet inte om det här ämnet fortfarande är aktuellt och intressant för några av er, men i allmänhet hade jag exakt samma problem.

Jag bestämde mig för att Gas ORM skulle vara min kartläggare i kombination med CodeIgniter. Eftersom min databasstruktur gavs och den inte följde table_pk-konventionen för Gas, var jag tvungen att definiera en främmande nyckel av mig själv som ska hänvisa till min anpassade databas främmande nyckel. Definitionen av det hade dock ingen inverkan på någonting. Liksom ditt fel ovan kunde mapparen inte bygga rätt SQL-sats. Uttalandet liknade ditt:

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

Tja, det verkar som att Gas ignorerar de självdefinierade främmande nycklarna och försöker använda standardkonventionen table_pk. Det betyder att den tar tabellen (i ditt fall:pool) och primärnyckeln (id) genom att slå samman den med ett understreck.

Jag kom på att konstruktören av orm.php hanterar varje primär och främmande nyckel som definieras inom enheterna. På rad 191 anropar koden en if-sats kombinerad med tom funktion av php. Eftersom primärnyckeln alltid är definierad och det inte finns någon negation i uttalandet, hoppar den över den inre delen av satsen varje gång. Den inre delen tar dock hand om de självdefinierade främmande nycklarna.

Lång historia kort, Jag har lagt till en negation (!) i rad 191 i orm.php vilket leder mig till följande kod:

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

Tja, den här lilla fixen hjälpte mig mycket och jag hoppas att några av er också kan dra nytta av det här tipset.




  1. Finns det en anledning till att MySQL inte stöder FULLSTÄNDIG YTTRE JOINS?

  2. mysql-tjänsten startar inte/lägger på - timeout (Ubuntu, MariaDB)

  3. Kan jag använda en funktion för ett standardvärde i MySql?

  4. Lägger till sekunder till datetime i MySQL