0

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

我正在使用 CakePHP 2.5.1 的网站上工作,我遇到了一个非常奇怪的行为:如果我不这样做,我拥有的 2 个模型之一似乎拒绝使用不同的数据库配置(默认配置除外)不要把它放在 Cake 的默认模型文件夹中(如果我把它放在那里,一切都很好)。

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

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

我在那里的 2 个模型称为CampanyaEjercicioMultChoice

一切似乎都已正确设置:

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

我可以毫无问题地在控制器中调用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模型文件移动到 Cake 的默认app/Model/文件夹,那么我没有任何问题。

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

编辑

所以我相信我已经发现了问题所在,并找到了解决方法,但我仍然想知道为什么会发生这种情况以及如何让它按应有的方式工作。

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

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

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

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

4

2 回答 2

0

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

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

无论如何,它现在有效!

于 2014-10-06T22:05:42.690 回答
0

据我所知,蛋糕没有加载您提供的模型文件!您可以通过exit();在该(共享)文件的第一行中调用并查看您的应用程序是否尊重这一点(通过显示白页,-))来查找。

如果没有,您的模型文件不会被 cakephp 拾取。

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

如果您可以确认/证明文件已被拾取,我会自愿设置这个场景并尝试自己在那里发生了什么 - 但我很确定我是对的。

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

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

于 2014-10-07T10:40:42.287 回答