模型(引用)在Controller中表现奇怪

时间:2012-05-18 14:14:17

标签: php cakephp cakephp-2.1 cakephp-appmodel

我对CakePHP 2.1.1项目有一个奇怪的问题 问题是如果我在竞争模型上调用find()(在下面的代码中),就在它之后我在另一个模型中调用自定义方法时,操作失败并出现以下错误:

Error: SQLSTATE[42000]: Syntax error or access violation: 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 'getAddedPlayersIds' at line 1

SQL Query: getAddedPlayersIds 

我的CompetitionsController :: view()代码如下:

public function view($id = null) {
        $this->layout = 'competition';
        $this->Competition->id = $id;
        if (!$this->Competition->exists()) {
            throw new NotFoundException(__('Invalid competition'));
        }

        $active = $this->Competition->field('active', array('id' => $id));
        if (!$active) {
        $this->redirect(array('controller' => 'pages', 'action' => 'display', 'competition_inactive'));
        }
            //THIS IS WHERE IT BECOMES STRANGE:
        $competition = $this->Competition->find('first', array('conditions' => array('Competition.id' => $id)));

        $addedPlayersIds = $this->CompetitionsPlayer->getAddedPlayersIds($id);

            //SOME CODE INTENTIONALLY REMOVED HERE!!!       

        $this->set('playerShops', $playerShops);    
        $this->set('messages', $messages);
        $this->set('competition', $this->Competition->read(null, $id));
            //render() IS CALLED FOR A SPECIFIC REASON
        $this->render();
    }

这就是CompetitionsPlayer::getAddedPlayersIds()方法的样子:

public function getAddedPlayersIds($competitionId = null){
        if(!isset($competitionId)) {
            return false;
        }

        $this->displayField = 'player_id';
        return $this->find('list', array('conditions' => array('competition_id' => $competitionId)));
    }

我最初认为它以某种方式打破了,因为变量名称我将Model :: find()操作的返回分配给了'竞争',但更有意思的是,如果我移动比赛:在MatchsPlayer :: getAddedPlayersIds()之后调用find()调用它! 此外,如果我重命名变量,它有时会工作,有时不会......!? 我仍然无法弄清楚是什么时候因为我现在没有时间进一步研究这个问题。 请注意,根据调试信息,通过数据库执行的查询是:

getAddedPlayersIds

这是我正在调用的函数的名称!

正如我所提到的,我已经知道了解决方法 - 只需交换两个调用。但是如果第一个是在秒之前并且没有其他方法可以实现手头的任务怎么办? 我现在想要的只是知道为什么会这样?

2 个答案:

答案 0 :(得分:0)

这通常发生在它无法找到你的模型时,而Cakephp会加载一个默认模型,因此没有getAddedPlayersIds方法,而且蛋糕认为它是一个神奇的查询。

这是我的建议,请仔细检查您的文件名和路径。

我能看到的一个可能的问题是这一行:

$this->CompetitionsPlayer->getAddedPlayersIds($id);

不应该是:

$this->Competition->CompetitionsPlayer->getAddedPlayersIds($id);

通过模型关联和链接。该模型是如何设置的?有什么关系?

答案 1 :(得分:0)

事实证明,当使用Model::field()时,函数的实现设置递归为-1或0. CakePHP核心代码是:

public function field($name, $conditions = null, $order = null) {
//Some code ommited
    if ($this->recursive >= 1) {
        $recursive = -1;
    } else {
        $recursive = $this->recursive;
    }
//Some code ommited
}

正如所解释的那样,问题就在于此。我知道这是性能优化,但我不确定这是一个功能还是一个问题。对我来说这是一种奇怪的行为。