更新:请参阅下面我的编辑部分,在那里我解释了我在测试后发现的内容
我正在使用CakePHP 2.5.1的网站上工作,我遇到了一个非常奇怪的行为:如果我不把它放在Cake的默认模型文件夹中,我似乎拒绝使用不同的数据库配置(除了默认配置)把它放在那里一切工作伟大)。
两个模型都位于同一个文件夹中,而该文件夹恰好不是默认的模型文件夹(这是因为这些模型与其他网站共享,并且我有一个中心位置放置所有共享的模型)。
为了找到这些模型,我在引导程序中使用了以下代码行。php文件:App::build(数组('Model'=
我有两种型号,分别是Campanya和EjercicioMultChoice。
一切似乎都设置正确:
App::对象('Model')
,我可以看到两个模型都列在那里,这意味着Cake在外部文件夹中找到它们get_class_vars('DATABASE_CONFIG')
,我可以看到两个数据库配置:Campanya使用的默认配置和EjercicioMultChoice使用的自定义配置(称为BD_Contenidos)。
$use
变量数组。我可以在控制器中调用Campanya模型,没有任何问题。但是,当调用EjercicioMultChoice模型时,我得到以下错误:
MISSING DATABASE TABLE
Error: Table ejercicio_mult_choices for model EjercicioMultChoice was not found in datasource default.
这是EjercicioMultChoice模型文件的样子:
class EjercicioMultChoice extends AppModel {
public $name = 'EjercicioMultChoice';
public $primaryKey = 'id';
public $useTable = 'ejercicios_multiple_choice';
public $useDbConfig = 'BD_Contenidos';
}
如您所见,该模型指示使用特定的数据库配置,这是Cake知道的,但在上面显示的错误中,它表示无法在datasource default中找到该表。它不能,因为它不在那里,当然,它在另一个数据库的另一个表中(顺便说一句,这另一个数据库与默认数据库在同一个服务器中,我在其他项目上使用它时没有问题)。
正如我上面提到的,如果我移动完全相同的EjercicioMultChoice.php模型文件到蛋糕的默认应用程序/模型/文件夹,那么我没有任何问题。
所以我在这里有点迷路了,我不知道还能查到什么来找出问题所在。
编辑
因此,我相信我已经发现了问题所在,并找到了解决办法,但我仍然想知道为什么会发生这种情况,以及如何才能使其正常工作。
如果在调用模型之前添加这两行代码(两行代码),则一切正常:
$this->EjercicioMultChoice->setDataSource('BD_Contenidos');
$this->EjercicioMultChoice->setSource('ejercicios_multiple_choice');
这显然意味着,即使Cake找到了EjercicioMultChoice。php模型文件,指示数据库和表名,它忽略这两个变量($useTable和$useDbConfig)。唯一可行的方法是用我上面写的方法手动设置这两个变量。
为什么会这样?如果模型文件位于默认文件夹中,则不会发生此情况。。。
好吧,问题似乎是我没有将尾部的/
放在App::build()路径中。正确的应该是App::build(数组('Model'=
让我难以理解的是,Cake实际上是在该文件夹中查找模型,即使没有尾部的/
,但由于某种原因,它无法加载这些模型文件的内部内容。
不管怎样,现在起作用了!
据我所知,蛋糕没有加载您提供的模型文件!您可以通过在该(共享)文件的第一行放置一个出口();
调用来找到答案,并查看您的应用程序是否尊重这一点(通过显示一个白色页面,-)。
否则,您的模型文件不会被cakephp获取。
另一种检查模型文件是否被拾取的方法是定义一个自定义成员变量,如Public$myModelTestVar='share dModel';
到文件中,然后在使用模型的控制器中检查变量(只需debug($this-
如果你能确认/证明文件被提取,我会自愿设置这个场景,并尝试自己那里发生了什么——但我非常确定我是对的。
debug(dirname(ROOT) . DS . '_shared/Cake_v2/Model')
为了证明它指向了你期望的地方。