动态创建的数据源未传递到 CakePHP 中的关联模型

2024-05-26

我有一个模型 - 汽车 - 该汽车有几个关联的模型,让我们考虑其中一个与hasMany关系-轮

在我的 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 的表轮。

由于某种原因,数据源没有从父模型传递到关联的子模型。如果我使用以下行在 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);
}

为了回答你的评论,我会添加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);
}

希望这可以帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态创建的数据源未传递到 CakePHP 中的关联模型 的相关文章

  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • 保存多对多关系,同步/附加不存在?

    我有以下两个多对多关系的模型 use Illuminate Database Eloquent Model class Permission extends Model The database table used by the mode
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • PHP 通过 SSL 连接到 MS SQL

    我想要实现的目标非常简单 我想通过安全连接从 PHP 脚本连接到外部 MS SQL 数据库 然而 这已被证明是有问题的 到目前为止 经过三个小时的研究 我不知所措 客户端的平台是Ubuntu 这意味着我无法使用SQLSRV 安全连接已经在不
  • 按文件名对 $_FILES 进行排序 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 他俩 如您所知 在新的 HTML5 中 您可以非常轻松地上传多个文件 但我这里的问题是如何按列 名称 对 FILES 数组进行排序 这是
  • 无法访问 localhost/xampp/index.php

    我刚刚安装了 Windows 7 的 XAMPP 控制面板似乎工作正常 我启动了 MySql 和 Apache 我遇到的问题是 当我在浏览器 Google Chrome 中输入 localhost 时 它会将我发送到 http localh
  • PHP:读取所有传入 HTTP 请求的类 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Xdebug V3 不会停止 VSCode 中的断点

    我正在尝试使用 VSCode 在 XAMPP 上进行调试 但没有成功 我知道有很多关于这个的问题 我已经尽了一切努力 但仍然行不通 我的 xdebug 扩展确实有一件奇怪的事情 我目前使用 PHP v7 4 12 和 Xdebug 版本 3
  • CakePHP 身份验证插件身份关联

    我正在使用 CakePHP 3 8 并迁移到身份验证插件 https book cakephp org authentication 1 1 en index html https book cakephp org authenticati
  • 如何在 PHP 的 HTML 页面中显示错误消息?

    我有以下登录表单 login php 其中要求输入用户名和密码
  • 使用 PHP glob 列出 FTP 服务器上的文件不起作用

    我使用此代码来访问目录 location files pictures glob location png 我想使用 FTP 访问远程路径 location opendir ftp user password host name files
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • PHP 中标头的使用

    非常简单的问题 这两个 PHP 版本 5 标头调用中哪一个是 最好的 header Not Modified true 304 header HTTP 1 1 304 Not Modified 我很确定第一个是最多价的 但只是好奇如果在 H
  • Nginx 502 网关错误。通过增加buffer来解决。为什么?

    我正在设置 LEMP 堆栈来运行 Drupal 我安装了 Nginx 和 PHP FastCGI Nginx 工作正常 但任何运行 PHP 的尝试都会出现错误 502 Bad Gateway 谷歌很快发现 nginx 502 错误网关 ht
  • PHP 接口有属性吗?

    PHP 中的接口有属性 还是只有方法 您可以在 DocBlock 中为接口声明属性 然后 IDE 将提示接口的这些属性 PhpStorm 会这样做 但这不会强制在实现类中实际实现这些字段 例如 property string passwor
  • 使用 php/regex 验证美国电话号码

    EDIT 我混合并修改了下面给出的两个答案 以形成完整的功能 现在它可以完成我想要的功能 然后是一些 所以我想我会将其发布在这里 以防其他人来寻找同样的东西 Function to analyze string against many p
  • 使用会话 php 创建 cookie?

    我使用会话来登录我网站中的用户 问题是 我想让用户remember密码 因此关闭 打开浏览器后他们不需要再次登录 我需要使用 cookie 和 session 来实现它吗 my code user POST user pass POST p
  • 在本地 SDK 服务器上工作时,实时 Google App Engine 上出现 404

    我已经在GAE标准环境上部署了几个PHP应用程序 一切正常 现在我正在部署一个新应用程序 该应用程序位于由gcloudSDK按预期工作 终端命令 dev appserver py log level warning app yaml 问题是
  • PayPal 网关已拒绝请求。安全标头无效(#10002:安全错误 Magento

    在 magento 中增加 PayPal 预付款 我已填写 magento admin 中的所有凭据 但是当我进入前端并单击 pay pal 按钮时 它给出了 PayPal 网关已拒绝请求 安全标头无效 10002 安全错误 我用谷歌搜索了
  • 通过 htaccess 将 PNG 解析为 PHP 仅适用于本地服务器,但不适用于网络服务器

    我用 PHP 创建了一个动态 PNG 图片 为了使用 PNG 扩展名 我创建了一个包含以下内容的 htaccess 文件 AddType application x httpd php png 在我的本地 XAMPP 服务器上 一切工作正常

随机推荐

  • 正则表达式与 ls 的用法

    我正在尝试使用 ER 扩展正则表达式 with ls like ls 我正在尝试打印包含扩展名的所有文件 我知道我可以用ls 但我想尝试使用 ER 当我运行该代码时 我收到此错误 ls No such file or directory 您
  • 如何使用 Tailwind CSS 更改输入范围滑块的颜色?

    祝您度过美好的一天 我目前正在尝试将一些颜色应用于简单的滑块范围
  • Elasticsearch 可搜索合成字段

    假设源文档 JSON 中存在几个名为的字段 a and b 属于类型long 我想构建一个综合字段 例如c 通过用下划线连接前面字段的值和 将其索引为keyword 也就是说 我正在研究一个可以通过如下虚构的部分映射来支持的功能 a typ
  • 如何使用批处理文件安装文件夹中的所有.exe?

    我正在尝试开发以下算法 对于当前文件夹 包含脚本的文件夹 中的所有文件 执行以下操作 将文件一一安装 cls setlocal disableDelayedExpansion if PROCESSOR ARCHITECTURE x86 se
  • python matplotlib 保存图形而不显示

    我想创建一个直方图并将其保存到文件中而不将其显示在屏幕上 我现在拥有的代码默认显示该图 我找不到任何方法来抑制显示该图 我也尝试过 pyplot hist nrs 也有同样的问题 import math time matplotlib py
  • 如何处理 SIGTERM

    Java 有没有办法处理收到的 SIGTERM 是的 您可以使用以下命令注册关闭挂钩Runtime addShutdownHook http java sun com javase 7 docs api java lang Runtime
  • 如何随机化(洗牌)JavaScript 数组?

    我有一个像这样的数组 var arr1 a b c d 我怎样才能随机 洗牌它 事实上的无偏洗牌算法是Fisher Yates 又名 Knuth 洗牌 https en wikipedia org wiki Fisher E2 80 93Y
  • HTMLUNIT getformbyname 网站中未指定表单名称

    我正在尝试使用 HTMLUNIT 单击网站上的按钮 我按照本教程进行操作http htmlunit sourceforge net gettingStarted html http htmlunit sourceforge net gett
  • Flutter:设置AppBar的高度

    我怎样才能简单地设置高度AppBar在颤振中 栏的标题应保持垂直居中 即AppBar 您可以使用首选尺寸 https api flutter dev flutter widgets PreferredSize class html clas
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • 使用 API 密钥和机密保护 Spring Boot API

    我想保护 Spring Boot API 的安全 以便只有拥有有效 API 密钥和秘密的客户端才能访问它 但是 程序内部没有身份验证 使用用户名和密码的标准登录 因为所有数据都是匿名的 我想要实现的目标是所有 API 请求只能用于特定的第三
  • 如何在时间序列图中添加和定义多条线?

    我正在使用 python 的plotly 库创建一个基于线的时间序列图 我想将其连接到时间序列数据库 但目前我一直在使用 csv 数据进行测试 是否有可能有一个x and y轴 时间与值 并从另一个 csv 列值 主机 加载多行并附加到 x
  • AWS S3 JavaScript SDK - 网络错误:网络故障

    我正在尝试使用 AWS 在浏览器网页的示例中提供的示例 并且我不断收到NetworkingError Network Failure错误 这是我正在使用的
  • 使用 select 从套接字和标准输入读取

    我正在编写一个基于 ncurses 的聊天程序 起初 我只编写了网络内容 没有 ncurses 一切都工作正常 但添加图形后我无法让客户端应用程序正常工作 主要问题是同时从标准输入和套接字读取 在无 ncurses 的版本中 我使用了 pt
  • 可移植 C# 的最佳实践 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我希望为 linux windows mac 任何其他平台编写一些 C 代码 并且正在寻找可移植代码的最佳实践 Project mono htt
  • 带有中间页面的 Django 管理操作:未获取信息

    我正在尝试创建一个管理操作 将自定义时间增量添加到某个日期 时间增量将从中间页面的输入中读取 确认后 我将将该增量应用到之前选择的每个实例 使用此代码 我针对这个问题进行了简化 我无法获取输入的时间增量的值 我无法判断用户是否按下了 应用
  • Scala SBT 版本依赖性二进制兼容性错误 scala-xml

    我有一个在 GitHub 上托管的项目 我使用 scala steward 来保持我的插件和依赖项最新 这在一段时间内有效 但现在使用此类自动更新却变成了一场噩梦 事情是这样的 在我的plugins sbt中 我依赖于scoverage 它
  • 索引越界异常

    你好 这段代码将返回indexoutofboundsException我真的不知道为什么 我想从中删除这些对象pointlist它们与中的对象相同list public void listOfExternalPoints List
  • IN 子句中带有参数列表的PreparedStatement [重复]

    这个问题在这里已经有答案了 如何在执行查询时为 JDBC 中的 preparedStatement 中的 in 子句设置值 Example connection prepareStatement Select from test where
  • 动态创建的数据源未传递到 CakePHP 中的关联模型

    我有一个模型 汽车 该汽车有几个关联的模型 让我们考虑其中一个与hasMany关系 轮 在我的 CarsController 中 我使用以下代码动态生成数据源 schemaName this gt Session gt read User