Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Beberapa Kunci Asing ke tabel yang sama Gas Orm

Saya tidak tahu, apakah topik ini masih terkini dan menarik bagi sebagian dari Anda, tetapi secara umum, saya memiliki masalah yang sama persis.

Saya memutuskan Gas ORM untuk menjadi mapper saya dalam kombinasi dengan CodeIgniter. Karena struktur basis data saya diberikan dan tidak mengikuti konvensi table_pk Gas, saya harus mendefinisikan kunci asing sendiri yang akan merujuk ke kunci asing basis data khusus saya. Namun, definisi itu tidak berdampak pada apa pun. Seperti kesalahan Anda di atas, pembuat peta tidak dapat membuat pernyataan SQL yang benar. Pernyataan itu mirip dengan milik Anda:

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

Yah, sepertinya Gas mengabaikan kunci asing yang ditentukan sendiri dan mencoba menggunakan konvensi table_pk default. Ini berarti, dibutuhkan tabel (dalam kasus Anda:pool) dan kunci utama (id) dengan menggabungkannya dengan karakter garis bawah.

Saya menemukan, bahwa konstruktor orm.php menangani setiap kunci utama dan kunci asing yang ditentukan dalam entitas. Pada baris 191, kode memanggil klausa if yang digabungkan dengan kosong fungsi dari php. Karena kunci utama selalu didefinisikan dan tidak ada negasi dalam pernyataan, ia melewatkan bagian dalam klausa setiap saat. Namun, bagian dalam menangani kunci asing yang ditentukan sendiri.

Singkat cerita, Saya menambahkan negasi (!) pada baris 191 dari orm.php yang membawa saya ke kode berikut:

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

Nah, perbaikan kecil ini banyak membantu saya dan saya harap beberapa dari Anda dapat memanfaatkan petunjuk ini juga.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Urutan MySQL berdasarkan relevansi

  2. Apa lapisan abstraksi basis data yang layak untuk Python

  3. Cara menggunakan 'pilih' dalam pernyataan 'masukkan' MySQL

  4. Cara menanyakan sql dengan catatan aktif untuk tanggal antara waktu yang ditentukan

  5. Pencadangan dan Pemulihan Sederhana untuk Database mysql dari Java