0

我对 CakePHP 2.1.1 项目有一个奇怪的问题。
问题是,如果我在 Competition 模型上调用 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() 操作的返回分配给变量名,即“竞争”,但更有趣的是,如果我移动 Competition::find () 在 CompetitionsPlayer::getAddedPlayersIds() 之后调用它有效!
此外,如果我重命名变量,它有时会起作用,有时不会......!?
我仍然无法弄清楚这是什么时候,因为我目前没有时间进一步研究。请注意,根据调试信息,在数据库上执行的查询是:

getAddedPlayersIds

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

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

4

2 回答 2

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
}

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

于 2012-05-29T14:43:30.687 回答
0

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

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

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

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

不应该是:

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

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

于 2012-05-18T14:37:11.703 回答