いっつもいっつもいっつもx100
やり方を忘れるので、自分のためにメモ
環境:CakePHP3.8
前置き・やりたいこと
購入履歴テーブルと、商品テーブルが それぞれ別のDBに存在するとする
購入履歴をとってくるときに、同時に購入した商品情報もとってくる
購入履歴.item_id で、 商品.product_id のデータを取ってくる
DBの定義 app.php
当然 2種類の Datasourcesの定義をしておく
'default'が、履歴があるDB(MySQL)
'product_db'が商品データのDB(ポスグレ)
'Datasources' => [
'default' => [
'className' => Connection::class,
'driver' => Mysql::class,
:
],
'product_db' => [
'className' => Connection::class,
'driver' => Postgres::class,
:
購入履歴テーブル - HistoryTableClass
商品テーブルとのアソシエーションの定義を書く
紐づくテーブルのFieldが PRIMARY KEY なら'bindingKey'は指定しなくていい(…と思ったけど。それって、テーブルのPKが Model名_id
ってなってる場合だけだっけ??忘れた。まあ、だめだったら'bindingKey'指定すればいい)
'strategy' => 'select',
←これが大事(これを指定しないと、商品テーブルに joinしてとってこようとする。同じDB内にtableが無いのでエラーになる)
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
:
:
//product_db
$this->belongsTo('Product', [
'foreignKey' => 'item_id', ←自分のテーブルでkeyになるField
'bindingKey' => 'product_id', ←joinするテーブルのkeyになるField
'strategy' => 'select',
]);
}
商品テーブル - ProductTableClass
defaultじゃなくて、'product_db'のコネクション定義を使ってることを書いておく→ 大事
/**
* Returns the database connection name to use by default.
*
* @return string
*/
public static function defaultConnectionName()
{
return 'product_db';
}
追記:2020/06/04
そういえば、コネクション指定は、bakeコマンドで モデル作成すれば自動で入れてくれる -c
オプション
$ bin/cake bake model -c [connection_name] [Model_name]
$ bin/cake bake model -c product_db Product
Controllerで呼び出してみる - HistoryController
$result = $this->History
->find()
->contain(['Product'])
->toArray();
取得した履歴データは ↓ こんな感じになってる
商品テーブルのデータが、配列でぶら下がってくる感じ
$result(履歴) = [
0 => [
'id' => 1,
'item_id' => 11001,
'buy_date' => '2020/05/05',
'product' => [
'id' => 100,
'product_id' => 11001,
'product_name' => '梅干し',
'price' => 398,
],
],
1 => [],
2 => [],
:
];