Mysql
 sql >> база данни >  >> RDS >> Mysql

Множество чужди ключове към една и съща таблица Gas Orm

Не знам дали тази тема е все още актуална и интересна за някои от вас, но като цяло имах точно същия проблем.

Реших Gas ORM да бъде моят картограф в комбинация с CodeIgniter. Тъй като структурата на моята база данни беше дадена и тя не следваше конвенцията table_pk на Gas, трябваше да дефинирам външен ключ от себе си, което ще се отнася до моята персонализирана база данни външен ключ. Дефиницията за него обаче не оказва влияние върху нищо. Подобно на вашата грешка по-горе, картографът не успя да изгради правилния SQL оператор. Изявлението изглеждаше подобно на вашето:

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

Е, изглежда, че Gas игнорира самодефинираните външни ключове и се опитва да използва конвенцията по подразбиране table_pk. Това означава, че той взема таблицата (във вашия случай:пул) и първичния ключ (идентификатор), като я слива със знак за долно подчертаване.

Разбрах, че конструкторът на orm.php обработва всеки първичен и външен ключ, дефиниран в обектите. В ред 191 кодът извиква клауза if, комбинирана с empty функция на php. Тъй като първичният ключ е дефиниран винаги и няма отрицание в израза, той пропуска вътрешната част на клаузата всеки път. Вътрешната част обаче се грижи за самодефинираните външни ключове.

Накратко, добавих отрицание (!) в ред 191 на orm.php, което ме отвежда до следния код:

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

Е, тази малка поправка ми помогна много и се надявам някои от вас да се възползват и от този намек.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функция MySQL LOG2() – Връщане на логаритъм на база 2 на стойност

  2. Извикване на недефинирана функция session_register()

  3. Как да сравните производителността на Moodle

  4. MySQL:Как да търсите в множество таблици низ, съществуващ във всяка колона

  5. MySQL Errno 150