CakePHP 2.x + Search Plugin アソシエーションされたモデルの情報で検索する

こ、これはハマる。。同じようなものをもう一回作る時に絶対ハマるのでメモ。

CakePHP 2.1
Search Plugin Version 2.1 for cake 2.x
https://github.com/CakeDC/search

Search Plugin 導入の情報まとめ

CakePHP2.0にSearch Pluginをいれてラクラク検索しよう

cakePHP2.1でSearchPlugin hasManyを扱う

Search Plugin for CakePHPで簡単検索機能実装

CakePHP の Search Plugin で複数のモデルを使用する

Searchプラグインを使ってCakePHPに検索を実装する

Pagenate関係

[CakePHP] paginateで他のモデルを使用する方法

1つの画面で複数のpaginateを使う方法

状況

モデル User, Item1, Item2とします。
Item1 belongsTo User で Item2 belongsTo Userの関係です。

users/index から User.fieldの項目でも検索したいし、Item1.fieldやItem2.fieldの項目でも検索したい、という状況。

ひとまず、参考記事をもとに構築→でも動かない。

変更点

コントローラーで、下記のようにしろと書いてあるが、これだとエラーになった。

1
2
3
4
5
    public function find() {
        $this->Prg->commonProcess();
        $this->paginate['conditions'] = $this->Article->parseCriteria($this->passedArgs);
        $this->set('articles', $this->paginate());
    }

Notice (8): Indirect modification of overloaded .....

上書きしてるから無効ですよって言われてる気がしたので、下のように修正。

$this->paginate = array('conditions' => $this->User->parseCriteria($this->passedArgs));

ビューファイルのお手本のままでは動かなかったので、下のように修正。

[googlead]

1
2
3
4
5
6
echo $this->Form->create('User', array(
    'url' => array_merge(array('action' => 'find'), $this->params['pass'])
));
echo $this->Form->input('User.name', array('div' => false));
echo $this->Form->submit(__('Search'), array('div' => false));
echo $this->Form->end();

User.nameとして、モデル名をつけています。要らないって話だったけど、コレ書かないとUndefined indexとかってエラーをもらうから書いちゃいます。

この時、Item1の項目を条件に使う場合でもUser.typeと書く。なんか気持ち悪いけど、とにかくItem.typeと書くと完全に無視された。

$usesでハマるハマる

UsersControllerでItem1の値を使いたい時に、$usesを使うと思うんですが、このとき必ず'User'を先頭に持ってこないとダメ。他のコントローラーからコピペで持ってきてたから順番がぐちゃぐちゃになってました。
これダメ
public $uses = array('Item1','User','Item2');

正しくは
public $uses = array('User','Item1','Item2');

$filterArgsの設定

これはマニュアルにも書いてあるけど念のため。

1
2
3
4
5
    // 検索対象のフィルタ設定
    public $filterArgs = array(
        'name' => array('type' => 'value', 'field' => 'User.name'),
        'type' => array('type' => 'value', 'field' => 'Item1.type')        
    );

これで、typeが'衣類'でもって'山田'さんに所持されているItem1が検索できますよっと。

はまったなー。

何かありましたらコメントをどうぞ

comments powered by Disqus

人気の記事

950 Points チリ出身のギタリストが弾くドラゴンボールZがむちゃくちゃかっこいい…
774 Points Wordpress + Heroku + PostgreSQL + Amazon S3 = ¥0 / 無料でサイト運営
700 Points Rubyのチートシート 変数 / クラス / モジュール
524 Points Rubyのチートシート / アクティブサポート
451 Points 紙のデザイナーがウェブ開発できるようになるまでに必要なこと
435 Points Rails / Google Analyticsのデータを使って分析や管理画面のためのグラフをつくる
323 Points RailsとHerokuでノーティフィケーションをプッシュする / PusherとTurbolinksの兼ね合い
222 Points Rails / RSpec テスト書いたことない メンドクサイ(n´Д`)という時のチートシート
193 Points Rails / Ajaxを使って画面遷移しない一時保存機能をつける
193 Points Protractorでスクレイピングしてみた