Labo

EC-CUBE3 分室

【3.0.15】商品検索の条件を OR検索 にする方法

2018年02月10日 / 投稿者名:chiharu


今回の内容は商品検索についてです。
商品検索の方法はいろんなポリシーがありますので一概には言えない部分があります。
ただ、複数の文言で検索したときの挙動がとても気になることがあります。
 
今回で言うと検索処理の際の AND 検索か OR 検索かというところです。
EC-CUBE は 2系の頃から AND 検索にて動いています。
勿論商品数が多い場合には絞り込みに有効な AND 検索が望ましいのかと思います。
一方で商品数が少ない場合や曖昧に名前を憶えている場合には OR 検索の方が良いのではないでしょうか。
 
私は特に名前を覚えるのが苦手なため OR 検索の方が助かる側の人間です(笑)
と云うことで、今回は検索条件を OR 検索にしてみる方法を試してみましょう。
 
■商品検索の条件を OR検索 にする方法
 
 ●ファイル
  <インストールフォルダ>/src/Eccube/Repository/ProductRepository.php
 ●モジュール
  getQueryBuilderBySearchData
 ●参考行目
  117行目ぐらいから
 ●変更内容

        // name
        if (isset($searchData['name']) && Str::isNotBlank($searchData['name'])) {
            $keywords = preg_split('/[\s ]+/u', $searchData['name'], -1, PREG_SPLIT_NO_EMPTY);

            foreach ($keywords as $index => $keyword) {
                $key = sprintf('keyword%s', $index);
                $qb
                    ->andWhere(sprintf('NORMALIZE(p.name) LIKE NORMALIZE(:%s) OR NORMALIZE(p.search_word) LIKE NORMALIZE(:%s)', $key, $key))
                    ->setParameter($key, '%' . $keyword . '%');
            }
        }

 ↓

        // name
        if (isset($searchData['name']) && Str::isNotBlank($searchData['name'])) {
            $keywords = preg_split('/[\s ]+/u', $searchData['name'], -1, PREG_SPLIT_NO_EMPTY);

            //foreach ($keywords as $index => $keyword) {
            //    $key = sprintf('keyword%s', $index);
            //    $qb
            //        ->andWhere(sprintf('NORMALIZE(p.name) LIKE NORMALIZE(:%s) OR NORMALIZE(p.search_word) LIKE NORMALIZE(:%s)', $key, $key))
            //        ->setParameter($key, '%' . $keyword . '%');
            //}

            $orKeywordText = '';
            $orKeywordArr = array();
            foreach ($keywords as $index => $keyword) {

                $key = sprintf('keyword%s', $index);

                if ( strlen( $orKeywordText ) > 0 ) {
                    $orKeywordText .= ' OR ';
                }

                $orKeywordText .= sprintf('NORMALIZE(p.name) LIKE NORMALIZE(:%s) OR NORMALIZE(p.search_word) LIKE NORMALIZE(:%s)', $key, $key);
                $orKeywordArr[ $key ] = $keyword;

            }
            $qb->andWhere( $orKeywordText );
            foreach ( $orKeywordArr as $oKey => $oVal ) {
                $qb->setParameter( $oKey, '%' . $oVal . '%');
            }

        }

 ●概要説明
  今回は AND 文でつないでいる部分を OR 文にて繋ぐ方法です。
  通常は全ての検索文言が AND で記述されています。
  変更した内容は検索文言のみ別途 OR 句で繋いだ後に AND 句で繋いでみました。
 
  やっては見たもののかなりの力押しですね(笑)
  特に解説は不要かなと思います。
  最初の foreach で or 句の文言をつないでいます。
  次の foreach で条件となる文言を setParameter する感じです。
 
 
実際にサイトで使う場合には「AND検索」と「OR検索」を選択できるようにしておかないと不便です。
その為よほどの条件が無い限りプラグインでの対応をしてください。
 ※確か有料のプラグインが存在していたはずです。
 
条件が揃えば試すのも楽しいかな、と言う程度で試して頂ければと思います。
と云うことで今回はこれで終了とさせて頂きます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

* Copy This Password *

* Type Or Paste Password Here *

*

コメント欄にコードを挿入したい場合は、[php][/php] を使ってください。