sql >> Database teknologi >  >> RDS >> Mysql

Flere fremmednøgler til samme tabel Gas Orm

Jeg ved ikke, om dette emne stadig er opdateret og interessant for nogle af jer, men generelt havde jeg præcis det samme problem.

Jeg besluttede, at Gas ORM skulle være min mapper i kombination med CodeIgniter. Da min databasestruktur blev givet, og den ikke fulgte table_pk-konventionen for Gas, var jeg nødt til at definere en fremmednøgle af mig selv, hvilket skal referere til min brugerdefinerede databasefremmednøgle. Definitionen af ​​det havde dog ingen indflydelse på noget. Ligesom din fejl ovenfor, var mapperen ikke i stand til at bygge den rigtige SQL-sætning. Udsagnet lignede din:

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

Nå, det ser ud til, at Gas ignorerer de selvdefinerede fremmednøgler og forsøger at bruge standardtable_pk-konventionen. Det betyder, at den tager tabellen (i dit tilfælde:pool) og den primære nøgle (id) ved at flette den med et understregningstegn.

Jeg fandt ud af, at konstruktøren af ​​orm.php håndterer alle primære og fremmede nøgler defineret i enhederne. I linje 191 kalder koden en if-klausul kombineret med empty funktion af php. Da den primære nøgle altid er defineret, og der ikke er nogen negation i sætningen, springer den den indre del af klausulen over hver gang. Den indre del tager sig dog af de selvdefinerede fremmednøgler.

Lang historie kort, Jeg tilføjede en negation (!) i linje 191 i orm.php, hvilket fører mig til følgende kode:

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

Nå, denne lille rettelse hjalp mig meget, og jeg håber, at nogle af jer også kan drage fordel af dette tip.




  1. Hvad er forskellen mellem kommaseparerede joinforbindelser og join på syntaks i MySQL?

  2. MySQL CASE for at opdatere flere kolonner

  3. Ydelsesmyter:Truncate kan ikke rulles tilbage

  4. Find ud af, hvor MySQL er installeret på Mac OS X