CodeLab技術ブログ

プログラミング技術まとめ

[CakePHP3]friendsofcake/searchでbelongsToManyを検索する

friendsofcake/searchの記事を以前書きましたが、それに関連して、belongsToManyなモデルで検索する場合どうしたらいいかを調べてみました。
searchプラグインについて基本的な使い方がわからない場合は、まず以前の記事を先に見てください。

バージョン
CakePHP3.7

スポンサードリンク

belongsToManyの検索例としてよくあるのが、ブログの記事などで、複数のタグがある場合で、特定のタグが含まれている記事だけを探す。。。みたいな場合ですね。
Cake3の公式サイトにも例があります。
matching と joins を用いた関連データによるフィルタリング

普通に検索する場合はこの例の通りにやればいいんですが、friendsofcake/searchの場合どう書くのかちょっとよくわかりませんでした。
まぁ、コントローラーないで手動で$this->request->getQueryParams()からパラメータを引っ張ってきて、追記してあげれば一応動くのですが、かっこ悪いですよね。。。

いろいろ試した結果、書き方はこんな感じでいいようです。

    public function searchConfiguration()
    {        
        $search = $this->searchManager()
        ->useCollection('default')
        ->add('tags', 'Search.Callback', [
            'callback' => function ($query, $args, $filter) {
                return $query->matching('Tags', function ($q) use($args) {
                    return $q->where(['Tags.id' => $args['tags']]);
                });
            }
        ])
        return $search;
    }

Search.Callback というオプションがあるようで、これを使って上記のように書けばOK。
$args に、フォームから来た検索オプションが入っているようなので、それを使ってフィルタリングをしてあげればOK。

なお、例のパターンは一つのタグだけを検索する場合ですが、複数の場合は

return $q->where(['Tags.id IN' => $args['tags']]);

などとすればよいでしょう。(もちろんフォームの変更もお忘れずに)

スポンサードリンク

スポンサードリンク
スポンサードリンク

コメントは受け付けていません。