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

Shunsuke Sawada

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

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が検索できますよっと。

はまったなー。

10
Shunsuke Sawada

おすすめの記事

CakePHP 2.x JSヘルパーでajax通信(ajax helperは使わない)
20
Rails4でQiita投稿ボタンをつくった
18
紙のデザイナーがウェブ開発できるようになるまでに必要なこと
451