CakePHP3で、外部キーを規約による指定とは別にしたい場合
開発環境は、WIndows10 Pro(64bit) + PHP 7.2.12 + CakePHP 3.7.9。
例えば、usersテーブルのidとdirectmessagesテーブルのuser_idが標準で関連づけているところを、directmessagesテーブルの別のidのsessionidカラムと関連づけたかったので、メモ。
※事前に、手動で外部キーとして指定したいカラムには、外部キーを貼っておくこと。
例えば、1対多の関係の場合は、それぞれのModelのTableのinitializeメソッド内に、
UsersTable.php
$this->hasMany('新しいモデル名',[ 'className' => '関連づけるモデル名', 'foreignKey' => '子テーブルの外部キー名' ]);
具体例:
$this->hasMany('SessionIdInDirectmessages',[ 'className' => 'Directmessages', 'foreignKey' => 'sessionid' ]);
DirectmessagesTable.php
$this->belongsTo('新しいモデル名',[ 'className' => '相手側のモデル名', 'foreignKey' => '子テーブルの外部キー名', 'joinType' => '接続するタイプ' ]);
具体例:
$this->belongsTo('SessionUsers', [ 'className' => 'Users', 'foreignKey' => 'sessionid', 'joinType' => 'INNER' ]);
実際に読み込む際は、
<?php # クラス外に指定 use Cake\ORM\TableRegistry; # コントローラやモデルのクラス内に $UsersTable = TableRegistry::getTableLocator()->get('Users'); $response = $UsersTable->find()->where(['Users.id' => 1]); $response->contain(['SessionIdInDirectmessages']); ?>