これは単純なbelongsToManyの状況ですが、リレーションの名前はエンティティテーブルの結合名ではないことが例外です。これは、関係が非常に特殊なものであるためです。結合テーブルには余分なデータは保持されていないので、throughオプションは不要です。Cakephp3のbelongsToManyクエリが正しく生成されていない
エンティティ:
table blacklists {
id int,
candidate_id int,
company_id int
}
CandidatesTable.php:コントローラで
$this->belongsToMany('BlacklistedCompanies', [
'className' => 'Companies',
'joinTable' => 'blacklists',
'foreignKey' => 'candidate_id',
'targetForeignKey' => 'company_id'
]);
問合せ:
table candidates {
id int,
<other fields>
}
table companies {
id int,
<other fields>
}
参加の表は、(候補者が会社をブラックリストに載せることができます)ランは、以下の不正なクエリが生成され、エラー(1054不明列)をスローしている
- 下部にある矢印を持つ行を参照してください。
SELECT
Blacklists.company_id AS `Blacklists__company_id`,
Blacklists.id AS `Blacklists__id`,
Blacklists.candidate_id AS `Blacklists__candidate_id`,
BlacklistedCompanies.id AS `BlacklistedCompanies__id`,
<remaining companies fields expunged>
FROM companies BlacklistedCompanies
LEFT JOIN blacklists Blacklists ON
(BlacklistedCompanies.id = (Blacklists.company_id)
AND Blacklists.id = (Blacklists.blacklist_id)) <<-- ERROR!!
WHERE Blacklists.candidate_id in (:c0)
なぜCakePHPはblacklist_idを探しています?どこにも存在しません。ブラックリストは、外部キーを持つエンティティではなく、どこでも参照できる結合テーブルです!
私は間違っていますか?