我在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()时,数据源会出现缺少表错误(在这种情况下为默认)。
模型是否可能未加载正确的数据库配置,因为该配置位于 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),我会收到数据库错误。
我在同一个文件夹中有另一个模型(MyModel),其中包含 $ useTable ='mytable'。如果我对其进行了 find(),则会收到错误消息,指出无法找到 mytable 表。但是,如果我 $ this-> MyModel-> useTable ='mytable',那么它可以正常工作。
这怎么可能?这是怎么回事?
编辑3
我只想补充一点,我已经做了大量的测试,问题很明显:Cake“知道”模型在外部文件夹中(通过打印 App :: objects('Model')确认< / strong>,模型列在那里,如果我从该文件夹中删除它,那么它就没有列出)。但即使它知道它在那里,它会忽略模型文件中的任何内容。我已经尝试了下面的所有方法加载模型,但没有一个工作。这是CakePHP中的错误吗?如果没有,我做错了什么?
答案 0 :(得分: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
}
}