1

私のCakePHP(1.2)アプリには、ページ付けを使用する2つのアクション(インデックスと検索)があります。

HAVING前の質問で、検索結果にしきい値スコアを適用するには、 MySQLキーワードを使用する必要があることを学びました。CakePHPはこれをネイティブにサポートしていないので、これを実現するにはカスタムクエリにドロップダウンする必要があります。

カスタムクエリページネーションについて私が見つけることができるすべてのガイドには、メソッドpaginate()paginateCount()メソッドのオーバーライドが含まれます。

ただし、インデックスで通常どおりページ付けできるようにしたいので、モデルの通常のページ付け動作を変更したくありません。

ケーキを持って食べられる方法はありますか?

4

2 に答える 2

3

実際、あなたがそれを見つけることができれば、あなたはパジネートでそれを行うことができます。こちらをご覧ください

ただし、より具体的には、findで使用する条件/制限/フィールド/包含/順序などをpaginate関数に追加できます。

私はpaginateでグループを使用していませんが、動作する必要があります:D

あなたの場合、あなたはこのようなものを持っているでしょう:

$this->paginate = array(
   'fields' => array(
        'Product.category_id',
        'COUNT(Product.hotel_id) as total'
    ),
   'group' => array(
        'Product.category_id HAVING COUNT(Product.hotel_id) > 1')
    )
);

$data = $this->paginate('Product');

それがうまくいくことを願って、あなたの結果のコメントを投稿してください、それがうまくいかない場合は、グループ条件を受け入れていないので、それをオーバーライドする必要があります...最終的にはページネーションが見つかるのでうまくいくと思いますが。

編集:

あなたはこのようなことをしようとするかもしれません:

paginate()とpaginateCount()をオーバーライドしますが、微調整を加えて条件をスニークし、ページ付けがあるかどうかを判断できるようにします。このようなもの:

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()){
   //if no having conditions set return the parent paginate 
   if (empty($conditions['having'])
       return parent::paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra)
   //if having conditions set return your override

//override code here

}

次に、paginateCount()で同様のことを行います。これにより、選択的なpaginateが作成されます。不要になったら$conditions['having']を設定解除することを忘れないでください。または、検索に影響を与えない場所に置くことを忘れないでください;)

于 2011-09-27T13:55:10.910 に答える
1

実際、これを機能させることは、あなたが合理的に予想するよりも頭痛の種でした。

私は基本的にapi55のアドバイスに従いましたが(ありがとう!)、他のハードルも飛び越えました。

  • することはできませんparent::paginateCount()。app_model.phpの別の(そして明らかに優れた)バージョンでオーバーライドすることで、これを克服しました。

  • paginateCount()はの単なるラッパーであるため、パラメータfind('count')を受け入れません。fieldsこれは、派生列(全文検索のスコア)を圧縮するためにこれに依存しているため、私にとっては注意が必要です。fields私はこれを2回の値をpaginate-に1回fieldsと1回は" "として渡すことで解決しましsneakyた。Cakeは、認識できないパラメータをextra配列に入れます。

  • これを結び付けるとpaginateCount()、モデルにextra「卑劣な」というキーがあるかどうかを確認するためのオーバーライドがありました。含まれている場合は、を実行find('all')し、の内容を使用してsneakyフィールドにデータを入力します。

今日のように、私は一歩下がって、フレームワークを使用することのすべての良い点を思い出さなければなりません。

于 2011-09-28T18:39:03.407 に答える