Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wiele kluczy obcych do tej samej tabeli Orm gazu

Nie wiem, czy ten temat jest jeszcze dla niektórych aktualny i interesujący, ale generalnie miałem dokładnie ten sam problem.

Zdecydowałem, że Gas ORM będzie moim maperem w połączeniu z CodeIgniterem. Ponieważ moja struktura bazy danych została podana i nie była zgodna z konwencją table_pk Gas, musiałem zdefiniować klucz obcy przeze mnie, który będzie odwoływał się do mojego niestandardowego klucza obcego bazy danych. Jednak definicja tego nie miała na nic wpływu. Podobnie jak w przypadku powyższego błędu, maper nie był w stanie zbudować właściwej instrukcji SQL. Oświadczenie wyglądało podobnie do twojego:

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

Wygląda na to, że Gas ignoruje samodzielnie zdefiniowane klucze obce i próbuje użyć domyślnej konwencji table_pk. Oznacza to, że pobiera tabelę (w twoim przypadku:pool) i klucz podstawowy (id), łącząc go ze znakiem podkreślenia.

Doszedłem do wniosku, że konstruktor orm.php obsługuje każdy klucz podstawowy i obcy zdefiniowany w ramach encji. W wierszu 191 kod wywołuje klauzulę if połączoną z pusty funkcja php. Ponieważ klucz podstawowy jest zdefiniowany zawsze i nie ma negacji w instrukcji, za każdym razem pomija wewnętrzną część klauzuli. Jednak wewnętrzna część zajmuje się samodzielnie zdefiniowanymi kluczami obcymi.

Krótko mówiąc, dodałem negację (!) w wierszu 191 pliku orm.php, który prowadzi do następującego kodu:

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

Cóż, ta mała poprawka bardzo mi pomogła i mam nadzieję, że niektórzy z was również skorzystają z tej wskazówki.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapisać tablicę PHP do MySQL?

  2. Dlaczego nadal potrzebuję zainstalowanego na komputerze łącznika MySQL, mimo posiadania odpowiednich pakietów NuGet?

  3. 2 najlepsze rekordy MySQL na grupę

  4. Problem z parametrem PDO bindParam

  5. Jak utworzyć unikalny losowy identyfikator liczby całkowitej dla klucza podstawowego dla tabeli?