0

CakePHP2.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'に割り当てている変数名のため、最初はどういうわけか壊れていると思いましたが、もっと興味深いのは、Competition::findを移動した場合です。 ()それが機能するCompetitionsPlayer :: getAddedPlayersIds()の後に呼び出します!
さらに、変数の名前を変更すると、機能する場合と機能しない場合があります...!?
現在、これをさらに調査する時間がないため、いつなのかまだわかりません。デバッグ情報によると、データベースに対して実行されるクエリは次のとおりです。

getAddedPlayersIds

これは私が呼び出している関数の名前です!

私が言ったように、私はこれの回避策をすでに知っています-2つの呼び出しを交換するだけですが、最初の呼び出しが秒の前にあり、手元のタスクを実装する他の方法がなかった場合はどうなりますか?
私が今欲しいのは、なぜこれが起こるのかを知ることだけですか?

4

2 に答える 2

0

これは通常、モデルが見つからず、Cakephpが代わりにデフォルトのモデルをロードする場合に発生します。そのため、getAddedPlayersIdsメソッドとCakeが魔法のクエリを考えていません。

これが私が提案することです、あなたのファイル名とパスを再確認してください。

私が見ることができる1つの考えられる問題はこの行です:

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

そうではないはずです:

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

モデルの関連付けと連鎖によって。そのモデルはどのように設定されていますか?関係は何ですか?

于 2012-05-18T14:37:11.703 に答える
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 に答える