Php 函数名用作SQL查询

Php 函数名用作SQL查询,php,cakephp,cakephp-1.3,Php,Cakephp,Cakephp 1.3,我遇到了一个与发现的问题非常相似的问题,但这些解决方案并不能帮助我解决我的问题。我正在使用CakePHP 1.3,并试图从视图控制器中调用一些模型函数: //Class setup var $uses = array('StudentsTelephone', 'AddressesStudent'); //... function someFunction(){ $this->set('telephones', $this->StudentsTelephone->ge

我遇到了一个与发现的问题非常相似的问题,但这些解决方案并不能帮助我解决我的问题。我正在使用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)有效,但第二个(addressstudent)失败。它尝试将函数名用作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中查找,而AddresssStudent从未被检查过。基于这些其他解决方案,它看起来应该是名称上的一个输入错误。然而,似乎所有东西的名称都是正确的。上面的代码如前所述,模型文件是
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
CakePHP使用“缓存”自动生成的模型 对于HABTM关系,CakePHP将自动为联接表生成一个“通用”模型(通过创建一个实例AppModel),即使联接表存在一个模型(不要问我为什么!)

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

在您的示例中,您尝试使用
AddresssStudent
模型。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。使用此键可以覆盖此默认名称。联接表模型可以像任何“常规”模型一样直接访问联接表


更多信息

在搜索了一整天之后,我解决这个问题的方法是在模型文件名中输入一个错误。我使用了
discounters.php
,它应该是
discounter.php


我希望这对别人有帮助

你能粘贴你的模式吗?@mbarlocker:现在是什么模式?学生模型的数据库?我可以,但由于函数调用从未找到模型PHP文件,那么这些信息有用吗?@mbarlocker:我刚刚添加了回溯,显示Cake试图在AppModel而不是AddressStudent中找到函数,这意味着问题在于查找AddressStudent。我很抱歉。这已经是我代码中的内容了。我在写问题的时候犯了一个错误,我刚刚在编辑中修正了这个问题。再次抱歉。你的工作值得称赞,但我不会给这个答案,因为我仍然需要找到我实际问题的答案。所以你可以删除这个答案,但我会转到你的另一个答案,给它一个加号。@golmschenk首先,你在其他位置使用与HABTM关系相同的表吗?可能是(正如我在回答中提到的)CakePHP正在使用缓存模型。要明确使用您自己的模型,可能需要尝试在HABTM关系中指定
className
,以防止CakePHP自动创建模型;看见另外,请尝试清除缓存目录
app/tmp/cache/persistent
app/tmp/cache/models
@golmschenk稍后将删除我的答案,如果我可以帮助您找到问题,请首先尝试:)@golmschenk哎呀,刚才注意到我在HABTM中提到了设置
className
,对于HABTM,这应该是“其他”模型的名称,我的意思是说带有选项的
;您应该将其设置为模型的名称(
AddresssStudent
),以强制CakePHP使用您的模型,而不是自动生成的模型,并防止它缓存自动生成的模型