💬
[CakePHP]SearchプラグインのbeforeProcess()について
beforeProcess()のコールバックの返り値
①falseの場合
beforeProcess()だけではなく、フィルターも実行されません
下記の様な場合は、qフィールドに対するLIKEによる検索は行われません。
$searchManager->like('q', [
'fields' => ['Posts.title', 'Authors.title'],
'beforeProcess' => function (\Cake\ORM\Query $query, array $args, \Search\Model\Filter\Base $filter) {
$query->contain('Authors');
return false;
},
]);
フィルターが実行されないのでWHERE句による検索が行われず、フィルター実行前と同じ値が返ります。
②null、返り値なしの場合
下記の様な場合は、qフィールドに対するLIKE検索とbeforeProcess()での$queryの操作が実行されます
$searchManager->like('q', [
'fields' => ['Posts.title'],
'beforeProcess' => function (\Cake\ORM\Query $query, array $args, \Search\Model\Filter\Base $filter) {
$query->where(['Posts.title' => 'hoge']);
},
]);
「太郎」と検索すると下記のようなSQL文になります。
WHERE
(
Posts.title = 'hoge'
AND Posts.title like '太郎'
)
③配列を返す場合
下記の様な場合、どんな検索値を入力してもhogeで検索されます。
$searchManager->like('q', [
'fields' => ['Posts.title'],
'beforeProcess' => function (\Cake\ORM\Query $query, array $args, \Search\Model\Filter\Base $filter) {
return ['q' => 'hoge'];
},
]);
WHERE Posts.title like 'hoge'
第3引数$filterについて
$filterにはその検索で使うフィルター自身が入るので、下記の様な場合はLikeフィルターになります。
$searchManager->like('q', [
'fields' => ['Posts.title', 'Authors.title'],
'beforeProcess' => function (\Cake\ORM\Query $query, array $args, \Search\Model\Filter\Base $filter) {
debug($filter->name()); //'q'が出力
$query->contain('Authors');
},
]);
動作確認時の環境
"friendsofcake/search": 6.2.3
ドキュメントの内容
beforeProcess (callable, default to null) フィルタのメインメソッドである process() が実行される前に、クエリを変更するために使用できる callable です。これは、引数として $query と $args を受け取ります。このコールバックを使用して、クエリに結合や包含を設定することができます。コールバックが false を返す場合は、フィルタの処理はスキップされます。コールバックが配列を返す場合は、フィルタの引数として使用されます。
以下のオプションは、Callback と Finder を除くすべてのフィルタでサポートされています。
Discussion