【问题标题】:Use a database view for a model in CakePHP 2.0在 CakePHP 2.0 中为模型使用数据库视图
【发布时间】:2023-03-07 16:58:01
【问题描述】:

从 Cake 1.3 升级到 2.0 后,我的所有使用数据库 视图 而不是表的模型都出现了丢失表错误。我使用表格的模型仍然可以正常工作。将这些模型更改为使用表格可以解决问题,但我需要视图。

过去这是有效的,如this question shows;视图就像表格一样工作。然而,在迁移到 Cake 2.0 之后,我得到:

错误:找不到模型 myModel 的数据库表 myView

这是一个模型类示例:

class Hauler extends AppModel
{
    var $useTable = 'hauler_view';
    var $primaryKey = 'id';
    var $useDbConfig = 'default';
}

视图 hauler_view 存在并在 1.3 中的应用程序中工作。如果我将模型设置为读取该物理表,则将视图中的相同数据复制到物理表中将起作用。

我已经确认我可以通过 Cake 的原始 SQL 函数访问数据库视图,所以我可以访问这些视图,只是模型没有看到“表”。

如果这很重要,我正在使用带有 sqlsrv 驱动程序的 SQL Server 2005。我的服务器上安装了 SQL Server 2008 Native Client,它允许这个版本的 cake 访问 SQL Server。

有没有办法让 CakePHP 2.0 中的模型使用视图而不是表?

我解决了this related problem,所以我现在知道我的数据库驱动程序运行正常,不是问题。

【问题讨论】:

    标签: database cakephp cakephp-2.0


    【解决方案1】:

    有几个解决方案可以尝试解决这个问题。

    1- 尝试使用upgrade shell 来纠正问题: 2-检查以确保模型文件名正确命名:app/Model/Hauler.php [注意文件和路径区分大小写] 3- 确保 AppModel.php 文件存在于模型目录中。这大概就是问题所在。请注意书中的内容:

    app/app_controller.php、app/app_model.php、app/app_helper.php是 现在定位并命名为 app/Controller/AppController.php, app/Model/AppModel.php 和 app/Helper/AppHelper.php 分别。

    AppModel.php 的顶部应该包含 uses 子句:

    <?php
    App::uses('Model', 'Model');
    class AppModel extends Model {
    
    }
    ?>
    

    您也可以在 the book 中阅读有关 AppModel.php 更改的信息。

    【讨论】:

    • 我已经完成了所有这些步骤; AppModel 没有自定义,所以我在 app/Model 中没有它,但是将 Cake 默认的一个复制到该目录中也没有做任何事情。升级脚本并没有解决所有问题,再次运行它仍然遇到问题。大多数模型确实可以工作,只是没有视图的模型
    • 将 appmodel/ect 移入 app/ 目录是对 2.1 而不是 2.0 的更改,但感谢您提供的链接,我继续进行这些更改以备将来验证。视图仍然中断。
    • 我想接下来要验证的是 SQL Server 连接以及它如何处理视图。我无权访问,所以我无法提供任何额外的帮助。对不起。但我很高兴听到设置是正确的并且可以排除。这可能是 2008 客户端与 2005 服务器通信方式特有的问题?
    • 尝试连接视图时,SQL Server 日志中是否有任何内容?
    • SQL Server 日志中没有关于它的任何内容,sqlsrv_errors() 没有给出错误消息,cake 自己的错误消息除了堆栈跟踪和丢失的表消息之外没有给出任何内容。我将添加堆栈跟踪,但我没有看到任何问题,这都是蛋糕内部的东西。
    【解决方案2】:

    这是 Cake PHP 2.0 分支中的 Open Bug,该错误仅影响 SQL Server,并且不允许模型使用 SQL Server 视图。计划在 Cake 2.0.6 版中修复。

    【讨论】:

      【解决方案3】:

      尝试在打开课程之前添加此代码:

      App::uses('AppModel', 'Model');
      

      您的代码似乎正确

      【讨论】:

      • 你的意思是把它放在模型类的文件中还是控制器打开模型的文件中?无论哪种方式它都不起作用(因为它扩展了 AppModel 它应该继承 Model 无论如何)。我真的不知道这些视图模型有什么不同......
      • 是的,CakePHP 2 是必需的。有趣的还是不行,可以把所有代码模型放上来吗?
      • 这就是整个代码类(在这种情况下实际上都可以推断出来),我没有自定义 AppModel。我正在处理 cdburgess 的建议
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2012-05-28
      • 2016-12-30
      • 1970-01-01
      相关资源
      最近更新 更多