k01ken’s b10g

He110 W0r1d!

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']);
?>


参考リンク
アソシエーション - モデル同士を繋ぐ - 3.8