4

ケーキベイクコマンドを使用して、フィクスチャとテストモデルを作成しています。私は自分のモデルの1つでそれを成功させましたが、別のモデルで問題が発生しています。

理由はわかりません。定義済みのテストDBではなく、デフォルトのDBで動作しようとします。これは、テストした最初のモデルで使用されたものです。

うまく機能するテストモデルと機能しない2番目のテストモデルはどちらもケーキベイクで作成されており、まったく同じように見えます。

それらの両方は、フィクスチャクラスにこれを持っています:

public $import = array('records' => true, 'connection' => 'test');

Testは、テストデータベースへの接続を定義します。何が問題になる可能性がありますか?

私は何か奇妙な実験をしました。私のテストモデルでは、複数形の代わりに単数形を使用すると、デフォルトのDBで動作しますが、複数形に変更すると、テストデータベースで動作します。(ただし、モデルからメソッドを呼び出すことはできません。find()などの定義されたメソッドのみを呼び出すことができます)。

例えば:

public function setUp() {
    parent::setUp();

    //uses the default DB (i dont know why)
    $this->Post = ClassRegistry::init('Post');          
    print_r($this->User->find('all'));

    $this->Post->updatePostsStatus(1); //works well

    //uses the default Test Database (i dont know why either)
    $this->Post = ClassRegistry::init('Posts');         
    print_r($this->User->find('all'));   

    $this->Post->updatePostsStatus(1); //doesn't work. No function found.
    /*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 'updatePostsStatus' at line 1*/

}

ありがとう。

更新しました。

最終更新と解決策

問題は、PostModelコンストラクターの初期化が不適切だったことです。複数形の使用は関係ありませんでした。これは、存在しないモデルを使用するようなものです。常にテストデータベースを取得します。コンストラクターを適切に初期化するための答えは次のとおりです 。CakePHPでモデルのコンストラクターを正しくオーバーライドする方法

4

1 に答える 1

1

この種のMySQLエラーは、CakePHPでは非常に誤解を招く可能性があります。

基本的に、実際の問題はラインにあります。$this->Post->updatePostsStatus(1);具体的に は、postsモデルのPostモデルまたはupdatePostsStatus()メソッドのいずれかが存在しないことです。

基本的にこの行にタイプミスがあります。メソッド名を確認してください。それはすべきupdatePostStatusですか?(投稿に複数形はありませんか?)


何らかの理由で、CakePHPのモデルで未定義のメソッドを呼び出そうとすると、メソッドが見つからないことを報告する代わりに、CakePHPの「自動魔法」が作動し、奇妙なことに、見つからないメソッド名をMySQLに直接プッシュしようとします。

基本的に、CakePHPはメソッドを見つけることができないため、$this->Post->updatePostsStatus(1);実際には、updatePostsStatusつまりのMySQLクエリを実行しようとしmysql_query("updatePostsStatus');ています。これが、この奇妙なデータベースエラーが発生する理由です。メソッド名のつづりを間違えた可能性があります。


それでもメソッド名に問題がない場合は、Postsモデルが正しくインスタンス化されていないことが関係しています。あなたがすべての名前を正しく理解している限り、それは疑わしいようですが。これは間違いなくデータベースの問題ではなく、Cakesが未知のクラスメソッドを自動的に処理する方法に欠けています。

于 2012-04-16T12:44:10.363 に答える