2

我在 bootstrap.php 中使用以下代码(如此所述)也从另一个文件夹加载模型:

App::build(array('Model' => array('/my/path/to/models')));

似乎有效。我在该文件夹中有一个模型MyModel,我将其包含在我想像往常一样使用它的控制器中:

var $uses = array('MyModel');

如果我打印App::objects('Model'),模型MyModel会显示在列表中,所以我假设它已正确加载。但是,当我尝试使用模型时(即$this->MyModel->find()它永远不会找到任何东西,它总是返回一个空数组。

请注意,如果我将相同的模型(MyModel)放在典型的模型文件夹(app/Model/)中,那么一切正常。

我缺少什么来完成这项工作?

编辑

好的,所以当模型放在app之外的那个文件夹中时,问题似乎出在与数据库的连接上。通过上面显示的代码,Cake 找到了模型。但是,当我执行find()时,我得到数据源的缺失表错误(在这种情况下为默认值)。

模型是否有可能没有加载正确的数据库配置,因为该配置位于app/Config文件夹中?如何使该模型加载该配置?如果我必须将该配置放在其他位置(可能在同一个外部文件夹中?)我可以这样做,但我如何告诉模型找到它?

编辑 2

我现在可以更好地看到问题所在。如果我将模型放在不同的文件夹中(除了app/Model)并使用App::build()设置新文件夹的路径,Cake 会找到它,毫无疑问(我使用App::objects('Model ')并且该模型与app/Model中的所有其他模型一起列出)。

然而,就好像 Cake 并没有真正阅读该模型类中的内容,或者至少不是所有内容。它似乎读取了$useDbConfig变量,但它忽略了$useTable和我在该模型中定义的任何函数。我的模型示例:

class Usuario extends AppModel {

var $name = 'Usuario';
var $primaryKey = 'id_usuario'; 
var $useDbConfig = 'BD_ControlAcceso';

function createTempPassword($len) {

    //some code
}
}

如果我执行$this->Usuario->find('all'),它会正确返回所有记录。但是,如果我调用$this->Usuario->createTempPassword(7)我会得到一个Database Error

我在同一个文件夹中有另一个模型(MyModel),带有$useTable = 'mytable'。如果我在其上执行find(),我会收到一条错误消息,指出无法找到mytable表。但是,如果我这样做$this->MyModel->useTable = 'mytable'那么它工作正常。

这怎么可能?这里发生了什么?

编辑 3

我只想补充一点,我已经进行了广泛的测试,问题很清楚:Cake“知道”模型在外部文件夹中(通过打印App::objects('Model')确认,模型在那里列出,如果我从该文件夹中删除它,则它不会列出)。但即使它知道它的存在,它也会忽略模型文件中的任何内容。我已经尝试了以下所有方法来加载模型,但都没有奏效。这是 CakePHP 中的错误吗?如果没有,我做错了什么?

4

1 回答 1

1

您应该使用App::uses('MyModel', 'Model')并且应该在类声明之前使用,如下所示:

<?php

App::uses('MyModel', 'Model');
App::uses('AppController','Controller');
class UsersController extends AppController {
 // controller class
}

另一件要尝试的事情是在需要的地方加载模型:

$this->loadModel('MyModel');

您可以尝试的另一件事是模型类顶部的模型实例化。尝试将您的模型更新为:

App::uses('AppModel','Model');
class Usuario extends AppModel {

var $name = 'Usuario';
var $primaryKey = 'id_usuario'; 
var $useDbConfig = 'BD_ControlAcceso';

function createTempPassword($len) {

    //some code
}
}
于 2013-01-16T02:54:53.797 回答