我遇到的问题与找到here和here的问题非常相似,但这些解决方案并没有帮我修复问题的版本。我正在使用CakePHP 1.3,我试图从视图控制器中调用一些模型函数:
//Class setup
var $uses = array('StudentsTelephone', 'AddressesStudent');
//...
function someFunction(){
$this->set('telephones', $this->StudentsTelephone->getActiveStudentTelepone($id));
$this->set('addresses', $this->AddressesStudent->getActiveByStudentId($id));
}
第一个模型函数调用(StudentsTelephone)工作,但第二个(AddressesStudent)失败。它尝试使用函数名作为SQL调用,结果为:
SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'getActiveByStudentId' at line 1 [CORE\cake\libs\model\datasources\dbo_source.php, line 684]
使用一些调试,我发现在AppModel中正在查找该函数,并且从不检查AddressesStudent。根据其他解决方案,它看起来应该是名称中的拼写错误。但是,一切似乎都正确命名。上面的代码如上所述,模型文件是addresses_student.php
,类名是AddressesStudent,这在我更新Cake之前工作正常(刚刚从1.1切换到1.3)。关于可能导致问题的原因的任何建议都不是命名错误?或者可能是其他一些我错过的命名错误?非常感谢!
DboSource::showQuery() - CORE\cake\libs\model\datasources\dbo_source.php, line 684
DboSource::execute() - CORE\cake\libs\model\datasources\dbo_source.php, line 266
DboSource::fetchAll() - CORE\cake\libs\model\datasources\dbo_source.php, line 410
DboSource::query() - CORE\cake\libs\model\datasources\dbo_source.php, line 364
Model::call__() - CORE\cake\libs\model\model.php, line 502
Overloadable::__call() - CORE\cake\libs\overloadable_php5.php, line 50
AppModel::getActiveByStudentId() - [internal], line ??
StudentsController::edit() - APP\controllers\students_controller.php, line 277
Dispatcher::_invoke() - CORE\cake\dispatcher.php, line 204
Dispatcher::dispatch() - CORE\cake\dispatcher.php, line 171
[main] - APP\webroot\index.php, line 83
答案 0 :(得分:2)
对于HABTM关系,CakePHP将自动生成JOIN表的“通用”模型(通过创建实例AppModel),即使连接表存在模型(不要问)我为什么!)
CakePHP将此自动生成的模型存储在其缓存中,以便可以在其他位置重复使用。
在您的示例中,您尝试使用AddressesStudent
模型。 CakePHP将查找具有该名称的模型,并在缓存中找到具有该名称的模型。 这是HABTM关系的自动生成模型,而不是您的实际模型!
为了防止CakePHP自动生成HABTM关系的模型,请将with
选项添加到这些关系中;一定要在关系的两个边指定这个(如果你在两边定义它,那就是)
在学生模型中;
$public hasAndBelongsToMany = array(
'Address' => array(
// tell CakePHP to use the AddressesStudent model,
// NOT and auto-generated model
'with' => 'AddressesStudent',
),
);
和/或地址模型内部;
$public hasAndBelongsToMany = array(
'Student' => array(
'with' => 'AddressesStudent',
),
);
通过执行此操作,您可以防止缓存包含自动生成的模型。
with:定义连接表的模型名称。默认情况下,CakePHP将为您自动创建模型。使用上面的例子,它将被称为RecipesTag。通过使用此键,您可以覆盖此默认名称。连接表模型可以像任何“常规”模型一样直接访问连接表。
答案 1 :(得分:0)
搜索了一整天后,我对这个问题的解决方案是在模型文件名中输入错误。我在应该discounts.php
的地方使用了discount.php
。
我希望这对某人有帮助!