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で他のモデルを使用する方法
状況
モデル 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が検索できますよっと。
はまったなー。