- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个模型 - Car - Car 有几个关联模型,让我们考虑其中一个与 hasMany
关系相关联的模型 - Wheel
在我的 CarsController 中,我使用以下代码动态生成数据源 -
$schemaName = $this->Session->read('User.schema');
$config = ConnectionManager::getDataSource('default')->config;
$config['database'] = $schemaName;
ConnectionManager::create($schemaName, $config);
然后我使用以下代码行在我的汽车模型中设置此数据源
$this->Car->setDataSource($schemaName);
在此之后我可以查询和操作 Car,但是,如果我尝试使用以下语句操作 Wheel - 我会收到错误
$this->Car->Wheel->create();
$this->Car->Wheel->save($wheelData);
我得到的错误是 -错误:[MissingTableException] 在数据源默认值中找不到模型 Wheel 的 table 轮。
由于某种原因,数据源没有从父模型传递到关联的子模型。如果我使用以下行在 Wheel 中明确设置数据源,那么一切正常。
$this->Car->Wheel->setDataSource($schemaName);
任何人都可以帮助阐明这种行为以及如何解决这个问题吗?我觉得这很不方便的原因是我的父模型有几个关联模型(还有关联模型)并且在每个模型上单独设置数据源听起来不对。
附带问题 - 有没有办法在尝试动态创建数据源之前检查数据源是否已经存在?我有一个包装整个代码的 for 循环,每次循环迭代最终都会创建一个新的数据源
我正在使用 CakePHP 2.5.4
最佳答案
这里是一些代码,它会将 setDatasource() 调用传递给关联的模型,如果您只希望 Car 模型通过其数据源,请将此代码放入 Car 模型中,如果您希望所有模型都通过,请将其放入在 AppModel.php
public function setDatasource($datasource = null) {
foreach (array_keys($this->getAssociated()) as $modelName) {
$this->{$modelName}->setDatasource($datasource);
}
parent::setDatasource($datasource);
}
为了回答您的评论,我会在 AppModel.php
中添加 public $dynamicDb = false
,这意味着 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);
}
希望对你有帮助
关于php - 动态创建的数据源未传递给 CakePHP 中的关联模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27790298/
经验丰富的程序员,但对 CakePHP 2.1 不熟悉,我花了一天的时间努力让自定义 Helper 在 View 中工作,遵循手册:http://book.cakephp.org/2.0/en/vie
任何人都可以列出 CakePHP 框架相对于其他 PHP 框架的缺点吗? 1) 请解释为什么缺少的功能对 PHP 项目如此重要? 2) 该缺失的功能如何帮助那些使用具有该功能的框架的 Web 开发人员
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我对 PHP 比较陌生。开始学习 PHP,但后来遇到了 cakePHP,它可以加快开发时间。 阅读文档和博客教程后,我仍然不明白命名约定。我想在我开始做一些例子之前我不会知道,但是为了让我开始,有人可
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
任何人都可以告诉我为什么当一个字段没有翻译时它返回空,而不是默认翻译? 我会感谢所有建议... 不知道你想看我代码的哪一部分,因为它都是直接来自 www.book.cake.org。所以我粘贴了一些代
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在编写一个支持多种测量单位的应用程序。在极少数情况下,用户想要更改他们的测量系统,我需要运行一个查询,该查询应用乘数将应用程序中的每个单位列缩放到正确的测量系统。为了确保所有数据在此操作出现问题时
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 8年前关闭
在用户模型中: var $hasMany = array( 'Photo' => array( 'className' => 'Photo',
剧透:我想更好地了解对 CakePHP 应用程序的请求的生命周期。 背景:我使用的是 CakePHP v2.3。我正在调试一个问题,该问题导致我无法找到的不想要的重定向。我正在尝试通过增量添加 die
在我的 Cake 应用程序中,我有一个 Controller “completed_projects”。它的索引操作不带参数并列出了一些项目。可以访问不同的页面example.com/complete
我找不到有关cakeError()定义为成员函数的任何信息。 documentation仅声明该调用看起来像这样: $this->cakeError(string $errorType [, arra
我创建了一个自定义数据源,该数据源从Web api获取数据,现在我正在研究实现错误处理。 在数据源中,我正在调用$ model-> onError()。在模型中,我创建了onError方法,并且可以使
除了重定向和渲染之外,还有其他命令可以将 Controller 重定向到特定 View 页面吗? 我的重定向为 $this->redirect('/forms/homepage/'.$userId);
我试图在我的字段中查找计数并连接该计数,但它给出错误消息,因为找不到 make_count 并且我在上面创建了相同的字段。 $this->Car->virtualFields['make_count'
我想要条件验证,即在更新密码时隐藏字段,并且密码验证为“6 到 15”个字符!因此密码以哈希格式存储在数据库中,因此不允许我更新。我的模型代码如下, array( 'rule
echo $form->input( 'country_id', array( 'type' => 'select', 'label' => __('C
我正在使用 CakePHP 创建一个锦标赛平台。目前,我已经创建了以下可以完美运行的表格、模型和 Controller :锦标赛、用户和团队。 我还创建了一个“Tournamentuser”表、 Co
我的场景是这样的: 在我的/views/layout/default.ctp 在我的/views/pages/home.ctp Html-
我是一名优秀的程序员,十分优秀!