以前紹介した[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なので、どれか一つのフィールドでヒットした場合に出力されます。
他にもいろいろあるっぽいんですよね。
でも、やりたいことは大体このどれかだと思います。