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

