2016-05-17 14 views
0

これは単純な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を探しています?どこにも存在しません。ブラックリストは、外部キーを持つエンティティではなく、どこでも参照できる結合テーブルです!

私は間違っていますか?

答えて

1

OKコアソースコードを数時間(ORMロジックをトレースすると本当に痛いです!!)進んで問題が見つかりました。

関係、会社の他の側は、開発サイクルの早い段階でのこの関係を持っていた:

$this->belongsToMany('Blacklists', [ 
      'className' => 'Candidates', 
      'joinTable' => 'Blacklists' 
    ]); 

私は候補者からの逆関係でそれを置き換える:

$this->belongsToMany('BlacklistingCandidates', [ 
      'className' => 'Candidates', 
      'joinTable' => 'Blacklists', 
      'foreignKey' => 'company_id', 
      'targetForeignKey' => 'candidate_id',      
    ]); 

そして、それはそうです期待どおりに働くこと。私は外国の重要なヒントの欠如が原因だと思う。

CakePHP3レッスン#1342:belongsToMany関係が対称であることを確認してください!

関連する問題