Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mehrere Fremdschlüssel zu derselben Tabelle Gas Orm

Ich weiß nicht, ob dieses Thema für einige von euch noch aktuell und interessant ist, aber im Allgemeinen hatte ich genau das gleiche Problem.

Ich habe mich für Gas ORM als Mapper in Kombination mit CodeIgniter entschieden. Da meine Datenbankstruktur vorgegeben war und nicht der table_pk-Konvention von Gas entsprach, musste ich einen Fremdschlüssel definieren von mir selbst, die sich auf meinen benutzerdefinierten Datenbank-Fremdschlüssel beziehen soll. Die Definition davon hatte jedoch keinen Einfluss auf irgendetwas. Wie bei Ihrem obigen Fehler konnte der Mapper nicht die richtige SQL-Anweisung erstellen. Die Anweisung sah Ihrer ähnlich:

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

Nun, es scheint, als würde Gas die selbstdefinierten Fremdschlüssel ignorieren und versuchen, die Standardkonvention table_pk zu verwenden. Das heißt, es nimmt die Tabelle (in Ihrem Fall:pool) und den Primärschlüssel (id), indem es sie mit einem Unterstrich zusammenführt.

Ich habe herausgefunden, dass der Konstruktor von orm.php verarbeitet jeden Primär- und Fremdschlüssel, der in den Entitäten definiert ist. In Zeile 191 ruft der Code eine if-Klausel in Kombination mit empty auf Funktion von php. Da der Primärschlüssel immer definiert ist und es keine Negation in der Anweisung gibt, wird der innere Teil der Klausel jedes Mal übersprungen. Der innere Teil kümmert sich jedoch um die selbstdefinierten Fremdschlüssel.

Um es kurz zu machen, ich habe eine Verneinung hinzugefügt (!) in Zeile 191 von orm.php, was mich zu folgendem Code führt:

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

Nun, dieser kleine Fix hat mir sehr geholfen und ich hoffe, dass einige von euch diesen Hinweis ebenfalls nutzen können.