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つの呼び出しを交換するだけですが、最初の呼び出しが秒の前にあり、手元のタスクを実装する他の方法がなかった場合はどうなりますか?
私が今欲しいのは、なぜこれが起こるのかを知ることだけですか?