Cakephp模型忽略数据库设置

时间:2014-10-04 02:03:59

标签: php database cakephp cakephp-2.5

更新:请参阅下面的编辑部分,我会解释测试后发现的内容

我正在使用CakePHP 2.5.1在一个网站上工作,我遇到了一个非常奇怪的行为:我的两个模型中的一个似乎模型文件夹中(如果我放在那里,一切正常),请拒绝使用不同的数据库配置(默认值除外)大)。

两个模型都位于同一个文件夹中,恰好是不是默认的模型文件夹(这是因为这些模板与其他网站共享,我有一个中心位置,我放置所有共享那些)。

为了让Cake找到这些模型,我在 bootstrap.php 文件中使用以下代码行:App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model')));

我在那里的两个模型叫做 Campanya EjercicioMultChoice

似乎所有东西都设置正确:

  • 如果我打印App::objects('Model')我可以看到其中列出的两个模型,这意味着Cake正在该外部文件夹中找到它们
  • 如果我打印get_class_vars('DATABASE_CONFIG'),我可以看到两种数据库配置:默认一种,由 Campanya 使用,自定义一个(称为 BD_Contenidos ),由 EjercicioMultChoice 使用。
  • 两个模型都包含在带有$uses变量数组的 AppController.php 中。

我可以在控制器中调用 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所知的特定数据库配置,但在上面显示的错误中,它说它无法在数据源中找到该表默认即可。它不能,因为它当然不在那里,它在另一个数据库中的另一个表中(顺便说一下,这个其他数据库与默认数据库在同一个服务器中,我使用它没有关于其他项目的问题)。

如上所述,如果我将完全相同的 EjercicioMultChoice.php 模型文件移动到Cake的默认 app / Model / 文件夹中,那么我就不会# 39;有任何问题。

所以我在这里有点迷失,我不知道还能检查什么,以找出问题所在。

修改

所以我相信我已经发现了问题是什么,以及它的解决方法,但我仍然想知道为什么会这样,我怎样才能让它按原样运作。

如果我在调用模型之前添加这两行代码(两者),那么一切正常:

$this->EjercicioMultChoice->setDataSource('BD_Contenidos');
$this->EjercicioMultChoice->setSource('ejercicios_multiple_choice');

这显然意味着即使Cake找到了指示数据库和表名的 EjercicioMultChoice.php 模型文件,它也会忽略这两个变量( $ useTable $ useDbConfig )。使其工作的唯一方法是使用我在上面编写的方法手动设置这两个变量。

为什么会这样?如果模型文件位于默认文件夹中,则不会发生这种情况......

2 个答案:

答案 0 :(得分:0)

好吧,问题似乎是我没有将尾随/放在 App :: build()路径中。正确的应该是App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model/')));

让我难以弄清楚的是,Cake实际上是在该文件夹中查找模型,即使没有尾随/,但由于某种原因阻止它加载这些模型的内部内容文件。

无论如何,它现在有效!

答案 1 :(得分:0)

据我所知,蛋糕没有加载你提供的模型文件! 您可以通过在该(共享)文件的第一行中调用exit();来查看该应用是否符合此要求(通过显示白页, - ))。

如果没有,那么你的模型文件不会被cakephp获取。

检查模型文件是否被拾取的另一种方法是为文件定义一个自定义成员变量,如public $myModelTestVar = 'sharedModel';,并检查控制器中使用该模型的变量(仅debug($this->EjercicioMultChoice)在行动中。)

如果你能确认/证明文件被拿起,我会自愿设置这个场景并尝试自己去那里 - 但我非常肯定我是对的。

debug(dirname(ROOT) . DS . '_shared/Cake_v2/Model')

以证明它指向你期望的地方。