3

ロケーション属性を持つusersテーブルがあり、(指定された半径内の)近くのユーザーを取得するモデル関数を作成したいと考えています。これが私のモデルです:

    クラスUserextendsAppModel {
        パブリック関数getNearbyUsers($ id、$ dist = 10){
            $ this-> query(...);を返します。
        }
    }

そして、これが私が関数を呼び出そうとしている私のコントローラーです:

    クラスUsersControllerはAppControllerを拡張します{
        パブリック関数getNearbyUsers($ id){
            ..。
            $ this-> User-> getNearbyUsers($ id)
            ..。
        }
    }

ただし、そうすると次のようになります。PHP Fatal error: Call to a member function getNearbyUsers() on a non-object

私は何が間違っているのですか?


編集:気にしないでください、それはもうそれについて不平を言っていません。しかし、SQLエラーがスローされ、モデル関数が実際に呼び出されることはありません。mysqlクエリログをさらに調べると、次のように表示されます。

    `xxx`からSHOWTABLESをクエリします
    getNearbyUsersをクエリします
    終了する


CakePHPは$this->User->getNearbyUsersをリテラルクエリとして解釈しているようです。だから私の質問はまだ残っています:Cakeのモデルにカスタム関数を追加する方法は?

4

3 に答える 3

4

http://book.cakephp.org/2.0/en/models/additional-methods-and-properties.htmlを参照してください:

CakePHP のモデル関数は必要な場所に到達する必要がありますが、モデル クラスはまさにそれであることを忘れないでください: 独自のメソッドを記述したり、独自のプロパティを定義したりできるクラスです。

データの保存とフェッチを処理する操作は、モデル クラスに格納するのが最適です。この概念は、しばしば脂肪モデルと呼ばれます。

モデル

class Example extends AppModel {
    function getRecent() {
        $conditions = array(
            'created BETWEEN (curdate() - interval 7 day) and (curdate() - interval 0 day)'
        );

        return $this->find('all', compact('conditions'));
    }
}

このgetRecent()メソッドをコントローラ内で使用できるようになりました。

コントローラ

$recent = $this->Example->getRecent();
于 2012-07-07T04:12:33.827 に答える
0

コードに追加する必要がある項目がいくつかあります。そうしないと、非オブジェクト エラーが発生します。

アプリ モデル内:

<?php

class Get extends AppModel {
    public function getRecent() {
        // $conditions = array(
            // 'created BETWEEN (curdate() - interval 7 day)' .
            // ' and (curdate() - interval 0 day))'
        // );
        // return $this->find('all', compact('conditions'));
    }
}

アプリコントローラーで、

?php



class GetsController extends AppController {

    public $uses = array('Get');  // Needed, or the error will appear.

    public function Example () {
       $this->Get->getRecent();
    }
}
于 2013-12-31T04:36:54.220 に答える
0

プラグイン (モジュール) を使用して Cake 1.3 で同じ問題が発生し、アプリ全体でモデル名が一意であったとしても(一部のモデル名は複数のプラグインで使用されます)、コントローラーでモデルを要求した場合にのみ機能しました。$uses次のように、プラグインを含む配列:'Module1.A'

app/plugins/plugin1/controllers/a_controller.php:

class AController extends AppController {

    // using simple array('A') worked fine for cake methods (find, query ...)
    // but did not recognized the custom method
    public $uses = array('Plugin1.A');

    public function Example () {
       $this->A->customMethod();
    }
}

app/plugins/plugin1/models/a.php:

<?php

class A extends AppModel {
    public function customMethod() {
        // ...
    }
}
于 2015-07-08T14:58:01.593 に答える