💬

[CakePHP]SearchプラグインのbeforeProcess()について

2021/12/14に公開

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 を除くすべてのフィルタでサポートされています。

https://github.com/FriendsOfCake/search/tree/master/docs

Discussion