更新:请参阅下面我的编辑部分,我解释了我在测试后发现的内容
我正在使用 CakePHP 2.5.1 的网站上工作,我遇到了一个非常奇怪的行为:如果我不这样做,我拥有的 2 个模型之一似乎拒绝使用不同的数据库配置(默认配置除外)不要把它放在 Cake 的默认模型文件夹中(如果我把它放在那里,一切都很好)。
两个模型都位于同一个文件夹中,而该文件夹恰好不是默认的模型文件夹(这是因为它们与其他网站共享,并且我有一个放置所有共享文件的中心位置)。
为了让 Cake 找到这些模型,我在bootstrap.php文件中使用了以下代码行:App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model')));
我在那里的 2 个模型称为Campanya和EjercicioMultChoice。
一切似乎都已正确设置:
- 如果我打印
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)。使其工作的唯一方法是使用我上面编写的方法手动设置这两个变量。
为什么会这样?如果模型文件位于默认文件夹中,则不会发生这种情况...