在CakePHP 2中,find()将从不同数据库中的相关模型返回数据,只要我在每个模型文件中正确设置$ useDbConfig即可。例如:
class Project extends AppModel {
public $useDbConfig = 'db1';
public $belongsTo = array(
'Client'
);
}
class Client extends AppModel {
public $useDbConfig = 'db2';
}
//in controller:
$this->Project->find('first'); //will get Client data
在CakePHP 3中,我使用defaultConnectionName()设置了我的表模型文件,并且在我的控制器中我使用带有'contains'的get()来获取相关模型,但我的一个相关表是在不同的数据库CakePHP 2似乎会发出一个单独的查询来获取这些数据,看起来像Cake 3尝试加入表,并且失败了“未定义的表:关系不存在。”
class ProjectsTable extends Table {
public static function defaultConnectionName() {
return 'db1';
}
public function initialize(array $config){
$this->addAssociations([
'belongsTo' => [
'Clients'
]
]);
}
}
class ClientsTable extends Table {
public static function defaultConnectionName() {
return 'db2';
}
}
//in controller:
$this->Projects->get($id,[
'contain' => [
'Clients'
]
]); //issues error that 'clients' relation does not exist
如果我直接在相关模型上使用get(),它运行正常 - 所以defaultConnectionName()是好的,但是当模型被查询为包含关系时,Cake会忽略它吗?或者我如何以不同的方式解决这个问题呢?
编辑:我的问题的解决方案来自CakePHP 3.x的更高版本:Changing Fetching Strategies。在另一个表的关联上设置'strategy' => 'select'
使得连接可以像在Cake 2中一样无缝地再次工作。