函数名称用作SQL查询

时间:2013-05-02 20:55:05

标签: php cakephp cakephp-1.3

我遇到的问题与找到herehere的问题非常相似,但这些解决方案并没有帮我修复问题的版本。我正在使用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)。关于可能导致问题的原因的任何建议都不是命名错误?或者可能是其他一些我错过的命名错误?非常感谢!

编辑:此外,这是回溯告诉我模型PHP文件从未找到:

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

2 个答案:

答案 0 :(得分:2)

CakePHP使用'缓存'自动生成的模型

对于HABTM关系,CakePHP将自动生成JOIN表的“通用”模型(通过创建实例AppModel),即使连接表存在模型(不要问)我为什么!)

CakePHP将此自动生成的模型存储在其缓存中,以便可以在其他位置重复使用。

在您的示例中,您尝试使用AddressesStudent模型。 CakePHP将查找具有该名称的模型,并在缓存中找到具有该名称的模型。 这是HABTM关系的自动生成模型,而不是您的实际模型!

告诉CakePHP使用您的模型而使用自动生成的模型

为了防止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。通过使用此键,您可以覆盖此默认名称。连接表模型可以像任何“常规”模型一样直接访问连接表。

更多信息; hasAndBelongsToMany (HABTM)

答案 1 :(得分:0)

搜索了一整天后,我对这个问题的解决方案是在模型文件名中输入错误。我在应该discounts.php的地方使用了discount.php

我希望这对某人有帮助!