【发布时间】:2013-01-04 18:31:11
【问题描述】:
我在我的 bootstrap.php 中使用以下代码(如 here 解释)也从另一个文件夹加载模型:
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() 时,我得到数据源的 missing table 错误(在本例中为 default)。
模型是否有可能没有加载正确的数据库配置,因为该配置位于 app/Config 文件夹中?如何使该模型加载该配置?如果我必须将该配置放在其他位置(可能在同一个 outside 文件夹中?)我可以这样做,但我如何告诉模型找到它?
编辑 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 中的错误吗?如果没有,我做错了什么?
【问题讨论】:
-
你不应该使用
App::uses('MyModel', 'Model');吗? -
具体在哪里?我尝试将它放在控制器页面的顶部,但没有...