スポンサードリンク

CakePHPはルールに従って
テーブルのカラム名を付けます。
そのおかげでアソシエーションした時に
自動でカラムをつなげてくれるのですが、
基本は1テーブルに1つの外部キーです。
しかし、2つの外部キーがあって
それぞれ参照先が同じテーブルの主キーだった場合の方法です。
スポンサードリンク
モデルのアソシエーションでカラムを指定
モデルにアソシエーションを書くときは
基本、モデル名を書くだけで
自動に「テーブル名_id」でテーブルをつなげてくれます。
しかし、2つの外部キーがあって
それぞれ参照先が同じテーブルの主キーだった場合は
「テーブル名_id」ではなく別の名前でカラム名を付けます。
そして、アソシエーションするときにカラムを指定します。
(例)
Userモデル(usersテーブル)のidを
Messageモデル(massagesテーブル)のsenderとreceiverに
belongsToでアソシエーションさせたい
Message.php
public belongsTo = array( 'Sender' => array('className' => 'User', 'foreignKey' => 'sender'), 'Resiver' => array('className' => 'User', 'foreignKey' => 'receiver') );
classNameで使用するモデル名を指定して
foreignKeyでつなげたいカラム名を指定します。
これで、1つのテーブルで複数の外部キーが使えます。
コントローラー側でモデルを指定する場合は
アソシエーション指定で使った名前を使います。
(例)コントローラーでモデルを外したりする場合
$this->Message->unbindModel(array( 'belongsTo' => array('Resiver') );
注意することは
複数の外部キーを使う場合は
「テーブル名_id」というカラムは使わないことです。
使うと優先的にそのカラムでつなげるので
この方法がうまくいきません。
なので複数の外部キーを使う場合は
別のカラム名で作ってください。
(参考)
1つのテーブルで複数の外部キーが同じテーブルを参照するとき、フィールド名はどうすればいいでしょうか。
スポンサードリンク