4

我正在使用 cake bake 命令来创建我的夹具和测试模型。我已经用我的一个模型成功地完成了它,但是我在另一个模型上遇到了麻烦。

我不知道为什么,它尝试使用默认数据库,而不是使用我已经定义的测试数据库,这是我测试的第一个模型使用的数据库。

两种测试模型,一个运行良好,第二个不运行,都是用蛋糕烘焙创建的,它们看起来完全一样。

他们两个在他们的夹具类中都有这个:

public $import = array('records' => true, 'connection' => 'test');

测试定义了到我的测试数据库的连接。可能是什么问题?

我做了一些奇怪的实验。在我的测试模型中,如果我使用单数而不是复数,它适用于默认的 DB,如果我将其更改为复数,它适用于测试数据库。(但它不能从模型中调用任何方法,只是定义了诸如 find() 之类的方法)。

例如:

public function setUp() {
    parent::setUp();

    //uses the default DB (i dont know why)
    $this->Post = ClassRegistry::init('Post');          
    print_r($this->User->find('all'));

    $this->Post->updatePostsStatus(1); //works well

    //uses the default Test Database (i dont know why either)
    $this->Post = ClassRegistry::init('Posts');         
    print_r($this->User->find('all'));   

    $this->Post->updatePostsStatus(1); //doesn't work. No function found.
    /*SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'updatePostsStatus' at line 1*/

}

谢谢。

我已经更新了它。

最后更新和解决方案

问题是 Post Model 构造函数的初始化错误。使用复数是不相关的。就像使用任何不存在的模型一样。它将始终获取测试数据库。构造函数初始化良好的答案在这里: How to override model's constructor correct in CakePHP

4

1 回答 1

1

这种 MySQL 错误在 CakePHP 中可能会产生很大的误导。

基本上,实际问题出在这一行。$this->Post->updatePostsStatus(1);具体来说,posts 模型的 Post模型或updatePostsStatus()方法不存在。

您基本上在这一行有错字,请检查方法名称。应该是updatePostStatus吗?(帖子上没有复数?)


出于某种原因,如果您尝试在 CakePHP 中调用模型上的未定义方法,而不是报告未找到该方法,CakePHP 的“自动性”就会发挥作用,奇怪的是它会尝试将未找到的方法名称直接推送到 MySQL。

基本上,因为 CakePHP 找不到该$this->Post->updatePostsStatus(1);方法,它实际上是在尝试执行updatePostsStatusie的 MySQL 查询mysql_query("updatePostsStatus');,这就是我们看到这个奇怪的数据库错误的原因。您可能只是拼错了方法名称。


如果方法名称仍然不是问题,则与Posts模型未正确实例化有关。尽管只要你把所有的名字都记对了,这似乎是值得怀疑的。这绝对不是数据库问题,只是 Cakes 自动处理未知类方法的蹩脚方式。

于 2012-04-16T12:44:10.363 回答