sql >> Databáze >  >> RDS >> Mysql

Více cizích klíčů ke stejnému stolu Gas Orm

Nevím, jestli je toto téma pro některé z vás stále aktuální a zajímavé, ale obecně jsem měl úplně stejný problém.

Rozhodl jsem se, že Gas ORM bude mým mapovačem v kombinaci s CodeIgniter. Protože moje struktura databáze byla dána a nesplňovala konvenci table_pk pro Gas, musel jsem definovat cizí klíč mnou, který bude odkazovat na cizí klíč mé vlastní databáze. Jeho definice však neměla na nic vliv. Stejně jako vaše chyba výše nebyl mapovač schopen vytvořit správný příkaz SQL. Prohlášení vypadalo podobně jako vaše:

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

No, zdá se, že Gas ignoruje cizí klíče, které si sám definoval, a pokouší se použít výchozí konvenci table_pk. To znamená, že vezme tabulku (ve vašem případě:pool) a primární klíč (id) tak, že je sloučí se znakem podtržítka.

Přišel jsem na to, že konstruktor orm.php zpracovává každý primární a cizí klíč definovaný v rámci entit. Na řádku 191 kód volá klauzuli if kombinovanou s prázdným funkce php. Protože primární klíč je definován vždy a v příkazu není žádná negace, pokaždé přeskočí vnitřní část klauzule. Vnitřní část se však stará o samostatně definované cizí klíče.

Krátce, Přidal jsem negaci (!) v řádku 191 orm.php, což mě vede k následujícímu kódu:

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

No, tato malá oprava mi hodně pomohla a doufám, že někteří z vás tuto nápovědu také využijí.




  1. Auto Increment varchar v MySQL

  2. Jak zobrazit celý dotaz ze SHOW PROCESSLIST

  3. Jak podmíněně zvládnout dělení nulou pomocí MySQL

  4. Jak nahrát obrázek PHP a vložit cestu do MySQL?