スポンサードリンク

CakePHP
CakePHP

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つのテーブルで複数の外部キーが同じテーブルを参照するとき、フィールド名はどうすればいいでしょうか。

スポンサードリンク