[CakePHP3]検索プラグインで複数カラムをLike検索する

以前紹介した[CakePHP3]Cake3で検索プラグイン(friendsofcake/search)を使うですが、複数カラムを横断してLIKE検索する方法がなかったのでやってみました。

バージョン
CakePHP3.7


例その1.ワイルドカード検索
1文字抜けの?や複数文字抜けの*で検索をかけられるバージョンです。
apple というデータがあったとして、a?ple で検索がヒットする奴です。

    public function searchConfiguration()
    {        
        $search = $this->searchManager()
        ->useCollection('default')
        ->add('keywords',
            'Search.Like', [
                'before' => true,
                'after' => true,
                'mode' => 'or',
                'comparison' => 'LIKE',
                'wildcardAny' => '*',
                'wildcardOne' => '?',
                'field' => ['Users.name', 'Users.email']
            ]
        );
        return $search;
    }

例その2.複数の単語にすべてヒットさせる
たとえば”Cake”,”PHP”,の二つの単語を含むカラムを検索したい場合は、以下のパラメータを追加

[
'multiValue'=>true,
'multiValueSeparator'=>",",
]

multiValueSeparatorは、単語を区切る文字列です。

例その3.複数の単語のどれか一つでもヒットしたら出す
たとえば”Cake”,”PHP”,のうち、どちらか一方でもあればヒットさせたい場合

[
'fieldMode'=>'or',
'multiValue'=>true,
'multiValueSeparator'=>",",
]

例その4.すべての検索キーワードにヒットした場合に出す

[
'valueMode'=>'and',
'multiValue'=>true,
'multiValueSeparator'=>",",
]

例その5.すべての複数フィールドにヒットする場合のみ出力

[
'before' => true,
'after' => true,
'fieldMode'=>'and'
'field' => ['Users.name', 'Users.email']
]

ポイントはfieldModeで、この場合nameとemailの両方ヒットした場合に出力されます。
fieldModeのデフォルトはorなので、どれか一つのフィールドでヒットした場合に出力されます。

他にもいろいろあるっぽいんですよね。
でも、やりたいことは大体このどれかだと思います。

タイトルとURLをコピーしました