Qbilinux 日記

Linux に関係することだけではなく,最近は一般的なコンピュータやガジェット関係についても記載してます.

cakephp3 での search plugin について

cakephp 用の search plugin ですが,これまで CakeDC の search plugin を使っていましが,cakephp3 をいじっているついでに FriendsOfCake の search plugin を使ってみました.

cakephp2 対応版の CakeDC との比較になりますが,FriendsOfCake の search plugin の方が導入は何だか簡単な気がしましたね.

基本的にはマニュアル通りに記載すれば動作しますが,入力された複数キーワードに対しての and 検索がしたかったので custom finder を設定して

public function searchConfiguration()
{
    $search = new Manager($this);
    $search
        ->finder('keyword');
    return $search;
}

public function findKeyword(Query $query, array $options)
{
    $fields = [$this->aliasField('hoge1'), $this->aliasField('hoge2') ];
    $keywords = preg_split('/[\s,]+/', $options['keyword']);

    foreach ($keywords as $keyword) {
        $opt_key = ;
        foreach ($fields as $field) {
            $opt_key
= [
                $field.' LIKE' => '%'.$keyword.'%'
            ];
        }
        $query->where([
            'OR' => $opt_key
        ]);
    }
    return $query;
}

な感じの Model 記述にしてみました.ちなみに form は

<?= $this->Form->create($hoge); ?>
<?= $this->Form->input('keyword', ['type' => 'text']); ?>
<?= $this->Form->submit('検索'); ?>
<?= $this->Form->end(); ?>

な感じ.と,keyword という input を使っているので Model 側では $options['keyword'] で入力が取れます.

キーワードの and/or 切り替え付けるなら,さらに form を追加して,$query->where への渡し方を $options で切り替えれば良さそうですね.

上記では $options['keyword'] をそのまま使って split 処理しているだけですが,$options['keyword'] に対するトリミングや各種タグやコマンド類の削除,クオートなどの処理等は適宜追加をしたほうがよいかと思います.cakephp 側や,search plugin などでもやっているかもしれないけど,念には念を入れてね.と一応書いておく.