2

findListBy(...) と呼ばれるマジック検索関数で CakePHP を拡張する方法を知りたいのですが、findAllBy(...) と同じことを行いますが、リストを返します。

同じことを行いますが、find('all', ...) の代わりに find('list', ...) を返す同等の findAllBy を探しています。

このような機能がない場合、どうすればそのような機能を自分で実装できますか? Magic Find Typesがどのように機能するのか、私にはよくわかりません:(

前もって感謝します

編集コマンドの長さを比較してください。どちらのコマンドも同じ配列を返す必要があります。

// The common find('list', ...)
$post = $this->User->find('list', array(
    'conditions' => array('user_id' => $this->Auth->user('id')),
    'fields' => array('Post.user_id', 'Post.id')
));

// findListByUserId(...)
$post = $this->User->findListByUserId($this->Auth->user('id'), array('Post.user_id, 'Post.id'));

そして YES : 返される配列の構造が必要です。

4

2 に答える 2

0

マップされたメソッド

マジックメソッドは、クエリ メソッドに直接findAllBy実装されています。使用中の dbo クラスを上書きしない限り、それに新しい順列を追加することはできません。

ただし、メソッド名を実際のメソッドに 1 対 1 でマッピングする必要はありません。独自の動的モデル関数を定義するには、ビヘイビアを作成し、mappedMethodsを定義します。次のような質問に適応します。

class MyBehavior extends ModelBehavior {

    public $mapMethods = array('/^findListBy/' => 'doSomething');

    public function doSomething(Model $model, $method, $arg1, $arg2) {
        // copy method name logic from DboSource::query
        
        return $Model->find('list', $params);
    }
}

ただし、動的なメソッド名を使用することは、params 配列を構築してfind('list', $params).

于 2013-07-30T14:02:20.023 に答える
-2

はい、ありますfind()

実際、これらの魔法のラッパーを使用する必要があるとは思いませんでした。すべてでも、リストでも、カウントでもありません。

特に、それらを使用している間、型ヒントとメソッド パラメーター ヒントまたは doc ブロック情報に 0 の可能性を提供するためです。

ヒント:

モデル レイヤーを使用して複雑なクエリを記述し、外部からそれらのラッパーにアクセスします。このようにして、クエリの構築全体がモデル内にとどまっている間、アクセスはまだ短くなります。タイプヒンティングなども保持します。

編集:答えの一部はコメントにありました。完全な答えがここにあることをより明確にするために改訂されました。

于 2013-07-30T13:03:59.943 に答える