Menentukan kunci asing dalam asosiasi milikToMany-through

Saya ingin menyetel kunci asing yang digunakan saat menggunakan asosiasi milikToMany-through di CakePHP 3.0.

Perhatikan dua tabel berikut:

entitas: id, judul
tautan: id, dari_id, ke_id, informasi_tambahan

Saya menggunakan asosiasi milikToMany-through karena informasi tambahan yang perlu saya simpan di tabel tembus.

Berikut adalah dua kelas Tabel:

class LinksTable extends AppTable
{
    public function initialize(array $config) {
        parent::initialize($config);

        $this->belongsTo('FromEntities', [
            'className' => 'Entity',
            'foreignKey' => 'from_id'
        ]);
        $this->belongsTo('ToEntities', [
            'className' => 'Entity',
            'foreignKey' => 'to_id'
        ]);
    }
}

class EntitiesTable extends AppTable
{
    public function initialize(array $config) {
        parent::initialize($config);

        $this->belongsToMany('Entities', [
            'through' => 'Links'
        ]);
    }
}

Namun tentu saja CakePHP mencoba menggabungkan tabel menggunakan kunci asing default entity_id, dan ini tidak benar.

Bagaimana cara menentukan kunci asing yang digunakan untuk menggabungkan tabel di kelas EntitiesTable?

Edit: Demi kelengkapan, berikut adalah pesan kesalahan dan kueri yang dihasilkan saat mencoba mengambil Entitas yang diasosiasikan menggunakan $this->Entities->findById(1)->contain('Entities');.

Kesalahan: SQLSTATE[42S22]: Kolom tidak ditemukan: 1054 Kolom tidak dikenal 'Links.entity_id' di 'daftar bidang'

SELECT Links.entity_id AS `Links__entity_id`, Links.id AS `Links__id`, Links.from_id AS `Links__from_id`, Links.to_id AS `Links__to_id`, Links.type AS `Links__type`, Links.role AS `Links__role`, Entities.id AS `Entities__id`, Entities.type AS `Entities__type`, Entities.title AS `Entities__title`, Entities.user_id AS `Entities__user_id`, Entities.created AS `Entities__created` FROM entities Entities INNER JOIN links Links ON Entities.id = (Links.entity_id) WHERE Links.entity_id in (:c0)

Ada beberapa kolom tambahan dalam kueri yang dihasilkan yang saya hapus dari contoh kode di atas, jika Anda bertanya-tanya.


person Lars Ebert    schedule 06.10.2015    source sumber


Jawaban (1)


Setelah menggali beberapa kasus pengujian, saya menemukan jawabannya di ini tes.

Metode belongsToMany memiliki opsi tidak berdokumen targetForeignKey, sehingga kelas EntitiesTable akan terlihat seperti ini:

class EntitiesTable extends AppTable
{
    public function initialize(array $config) {
        parent::initialize($config);

        $this->belongsToMany('LinkedEntities', [
            'className' => 'Entities',
            'through' => 'Links',
            'foreignKey' => 'from_id',
            'targetForeignKey' => 'to_id'
        ]);
    }
}

Sekarang saya dapat mengakses Entitas tertaut menggunakan $this->Entities->findById(1)->contain('LinkedEntities');

person Lars Ebert    schedule 06.10.2015