CakePHPで異なるDB間でアソシエーションを組む方法
バージョンはCakePHP2.4.6です。
DBはMySQLを使用しています。
異なるDB間でアソシエーションを組むにはどうしたらよいでしょうか?
同一DB内で試すと正しい結果が取得できているのですが、
異なるDBにすると望んだ結果が得られません。
DB・tableは下記のようになっています。
database.php
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => '192.168.*.***',
'login' => 'user',
'password' => 'pass',
'database' => 'customer_db',
'prefix' => '',
'encoding' => 'utf8',
);
public $company_db= array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => '192.168.*.***',
'login' => 'user',
'password' => 'pass',
'database' => 'company_db',
'prefix' => '',
'encoding' => 'utf8',
);
DB・Table構造
DB:customer_db
CREATE TABLE customer (
id INT NOT NULL AUTO_INCREMENT,
company_code INT NOT NULL,
customer_type varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
DB:company_db
CREATE TABLE company (
id INT NOT NULL AUTO_INCREMENT,
company_code INT NOT NULL,
company_name varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
INSERT INTO customer (company_code, customer_type) VALUES
(1, 'A'),
(2, 'B'),
(3, 'C');
INSERT INTO company (company_code, company_name) VALUES
(1, 'ああああ株式会社'),
(2, '株式会社いいいい'),
(3, 'うううう株式会社');
これを下記のようにアソシエーションしています。
コントローラー
<?php
class CustomerController extends AppController {
public $uses = array('Customer', 'Company');
public function index() {
$data = $this->Customer->find('all', array('limit' => 3));
$this->set('customer', $data);
}
}
モデル
//Customer.php
<?php
class Customer extends AppModel {
public $name = 'Customer';
public $useDbConfig = "default";
public $useTable = "customer";
public $belongsTo = array(
'Company' => array(
'className' => 'Company',
'fields' => array('company_code', 'company_name'),
'conditions' => array('Customer.company_code = Company.company_code')
)
);
}
//Company.php
<?php
class Company extends AppModel {
public $name = 'Company';
public $useDbConfig = "company_db";
public $useTable = "company";
}
これを実行すると下記のような結果が出力されます。
array(
(int) 0 => array(
'Customer' => array(
'id' => '1',
'company_code' => '1',
'customer_type' => 'A'
),
'Company' => array(
'company_code' => '1',
'company_name' => 'ああああ株式会社'
)
),
(int) 1 => array(
'Customer' => array(
'id' => '2',
'company_code' => '2',
'customer_type' => 'B'
),
'Company' => array(
'company_code' => '1',
'company_name' => 'ああああ株式会社'
)
),
(int) 2 => array(
'Customer' => array(
'id' => '3',
'company_code' => '3',
'customer_type' => 'C'
),
'Company' => array(
'company_code' => '1',
'company_name' => 'ああああ株式会社'
)
)
)
Customer側は全データ正しく取得できているのですが、
Company側が全て最初の1レコードしか取得できません。
そこでSQLのログを確認したところ下記のようなSQL文が発行されていました。
SELECT `Customer`.`id`, `Customer`.`company_code`, `Customer`.`customer_type` FROM `customer_db`.`customer` AS `Customer` WHERE 1 = 1 LIMIT 3
SELECT `Company`.`company_code`, `Company`.`company_name` FROM `company_db`.`company` AS `Company` WHERE 1 = 1
SELECT `Company`.`company_code`, `Company`.`company_name` FROM `company_db`.`company` AS `Company` WHERE 1 = 1
SELECT `Company`.`company_code`, `Company`.`company_name` FROM `company_db`.`company` AS `Company` WHERE 1 = 1
なぜJOINされないのかが調べてもわかりませんでした。
2つのテーブルを同一DB内に置いた場合は正しくJOINされていました。
異なるDB間でのJOINは不可能なのでしょうか?
よろしくお願い致します。