sql >> Database >  >> RDS >> Mysql

Meerdere buitenlandse sleutels naar dezelfde tafel Gas Orm

Ik weet niet of dit onderwerp nog steeds actueel en interessant is voor sommigen van jullie, maar over het algemeen had ik precies hetzelfde probleem.

Ik besloot Gas ORM mijn mapper te zijn in combinatie met CodeIgniter. Omdat mijn databasestructuur was gegeven en deze niet de table_pk-conventie van Gas volgde, moest ik een buitenlandse sleutel definiëren door mijzelf, die zal verwijzen naar mijn aangepaste database-externe sleutel. De definitie ervan had echter nergens invloed op. Net als uw fout hierboven, was de mapper niet in staat om de juiste SQL-instructie te bouwen. De verklaring leek op die van u:

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

Welnu, het lijkt erop dat Gas de zelfgedefinieerde externe sleutels negeert en probeert de standaard table_pk-conventie te gebruiken. Dit betekent dat het de tabel (in jouw geval:pool) en de primaire sleutel (id) nodig heeft door deze samen te voegen met een onderstrepingsteken.

Ik kwam erachter dat de constructor van orm.php verwerkt elke primaire en externe sleutel die binnen de entiteiten is gedefinieerd. In regel 191 roept de code een if-clausule aan in combinatie met de empty functie van php. Omdat de primaire sleutel altijd wordt gedefinieerd en er geen ontkenning in de instructie is, wordt het binnenste deel van de clausule elke keer overgeslagen. Het binnenste gedeelte zorgt echter voor de zelfgedefinieerde externe sleutels.

Om een ​​lang verhaal kort te maken, Ik heb een ontkenning toegevoegd (!) in regel 191 van orm.php die me naar de volgende code leidt:

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

Nou, deze kleine oplossing heeft me veel geholpen en ik hoop dat sommigen van jullie ook kunnen profiteren van deze hint.




  1. Equivalent van strftime in Postgres

  2. SQL Server-aanmeldingsfout:aanmelding mislukt voor gebruiker 'NT AUTHORITY\SYSTEM'

  3. Een MySql-database bijwerken met PHP via een onClick javascript-functie

  4. Hoe kom ik erachter of een Oracle-database is ingesteld op autocommit?