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

2010/10/25 追記: CakePHP の Search Plugin で HABTM なモデルを検索する方法について書きました。 /blog/2010/10/25/cakephp-search-plugin-habtm/


ここで使用している CakePHP のバージョンは 1.3.3 です。

Search Plugin すげー!と興奮しながら使用していたのですが、

  • post モデルの title フィールドと、
  • user モデルの username フィールド

を同時に検索するにはどうすればいいんだろう?というところでハマりました。

Search Plugin とは、検索機能を簡単に実装できる、(CakePHP 開発元である)CakeDC 製の CakePHP Plugin です。

CakeDC's search at master - GitHub http://github.com/CakeDC/search

一応解決できたのでメモ。 ここ違うよ!というところがあればツッコミをお願いします...

以下のコードは関係のある部分のみを載せてあります。

<?php
// models/post.php
class Post extends AppModel {
    var $belongsTo = array('User');

    var $actsAs = array(
        'Search.Searchable'
    );

    var $filterArgs = array(
        array('name' => 'title', 'type' => 'like'),
    );
<?php
// models/user.php
class User extends AppModel {

    var $actsAs = array(
        'Search.Searchable'
    );

    var $filterArgs = array(
        array('name' => 'username', 'type' => 'like'),
    );
<?php
// controllers/posts_controller.php
class PostsController extends AppController {
    var $components = array('Search.Prg');

    var $presetVars = array(
        array('field' => 'title', 'type' => 'value'),
        array('field' => 'username', 'type' => 'value')
    );

    function search() {
        $this->Prg->commonProcess();
        $this->paginate['conditions'] = $this->Post->parseCriteria($this->passedArgs);
        $this->paginate['conditions'] += $this->Post->User->parseCriteria($this->passedArgs);
        $this->set('posts', $this->paginate());
    }

2010/9/29 追記:

    var $presetVars = array(
        array('field' => 'title', 'type' => 'value'),
        array('field' => 'username', 'type' => 'value', 'formField' => 'username', 'modelField' => 'User.username', 'model' => 'User')
    );

と掲載していましたが、不要な部分があった為、削除しました。 formField, modelField, model については、'type' => 'lookup' の時のみ指定する必要があるみたいです。 valuecheckbox を指定している場合は必要ありません。

<?php
// views/posts/search.ctp
    echo $form->create('Post', array(
        'url' => array_merge(array('action' => 'search'), $this->params['pass'])
        ));
    echo $form->input('title', array('div' => false));
    echo $form->input('username', array('div' => false));
    echo $form->submit(__('Search', true), array('div' => false));
    echo $form->end();
?>

controllers/posts_controller.php で

$this->paginate['conditions'] = $this->Post->parseCriteria($this->passedArgs);
$this->paginate['conditions'] += $this->Post->User->parseCriteria($this->passedArgs);

としているところが肝かな... ちょっと気持ち悪い感じもしますが...

Search Plugin の使い方については、以下の記事や Search Plugin の README が参考になりました。 ありがとうございます!

Search Plugin for CakePHP で簡単検索機能実装 | Fusic Developers' Weblog http://blog.fusic.co.jp/archives/156

CakeDC's search at master - GitHub http://github.com/CakeDC/search

© 2023 暇人じゃない. All rights reserved.