3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CakePHPで複数DBから 同時にデータを取得するとき

Last updated at Posted at 2020-06-02

いっつもいっつもいっつも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 => [],
  :

];
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?