下面是一些代码,它将 setDatasource() 调用传递给关联的模型,如果您只想让 Car 模型通过其数据源,请将此代码放入 Car 模型中,如果您希望所有模型都通过,请将其放入AppModel.php
public function setDatasource($datasource = null) {
foreach (array_keys($this->getAssociated()) as $modelName) {
$this->{$modelName}->setDatasource($datasource);
}
parent::setDatasource($datasource);
}
为了回答你的评论,我会添加public $dynamicDb = false
in AppModel.php
,这意味着 false 将是该变量的默认值,然后在您的模型中通过添加来覆盖它public $dynamicDb = true
,然后将上面的函数改为:
public function setDatasource($datasource = null) {
foreach (array_keys($this->getAssociated()) as $modelName) {
if ($this->{$modelName}->dynamicDb === true) {
$this->{$modelName}->setDatasource($datasource);
}
}
parent::setDatasource($datasource);
}
(我还没有测试这个修改后的功能,因为我现在不在我的开发电脑上,但它是一个相当简单的更改,并且应该可以工作)
要在创建数据源之前检查数据源是否已存在,我可以看到两种可能的方法,一种是调用ConnectionManager::getDatasource($schemaName)
如果数据源不存在则捕获异常,或者调用ConnectionManager::sourceList()
并检查你的$schemaName
在返回的数组中,这是第一个选项的实现:
$schemaName = $this->Session->read('User.schema');
try {
ConnectionManager::getDatasource($schemaName)
} catch (MissingDatasourceException $e) {
$config = ConnectionManager::getDataSource('default')->config;
$config['database'] = $schemaName;
ConnectionManager::create($schemaName, $config);
}
和第二个选项:
$datasources = ConnectionManager::sourceList();
$schemaName = $this->Session->read('User.schema');
if (!in_array($schemaName, $datasources)) {
$config = ConnectionManager::getDataSource('default')->config;
$config['database'] = $schemaName;
ConnectionManager::create($schemaName, $config);
}
希望这可以帮助