質問 > フロント機能 > 商品一覧の検索処理の変更について |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
BlackBox |
投稿日時: 2021/6/28 15:53
対応状況: 開発中
|
新米 登録日: 2021/6/28 居住地: 投稿: 2 |
商品一覧の検索処理の変更について ▼ テンプレート
[EC-CUBE] EC-CUBE 4.05 新規インストールか、等 [レンタルサーバ] サクラサーバー [OS] FreeBSD 9.1 [PHP] 7.4.19 [データベース] MySQL5.7 ▼ 質問内容 初めまして、お世話になります。つい先日より、EC-CUBEの導入を考えEC-CUBE内容を確認しているところです。 商品一覧の検索処理を改造したいと考えております。オリジナルでは、送信した1つのcategory_idにマッチした物を 出力する動作ですが、改造後は送信した複数のcategory_id全てにマッチした物のみを出力したいと考えております。 "ProductRepository.php"、"getQueryBuilderBySearchData"にて、categoryに関するSQLを構築しており、該当箇所の 変更が必要と考えてます。 やりたいSQLは以下のイメージとなるのですが、★1部の変更方法でつまづいております。 (★2は2行コメントアウトするのみと思っています) ★1の変更方法または、SQL文を直接実行する方法などありましたら、ご教授よろしくお願いします。 [改造前のSQL] : [省略] : FROM dtb_product d0_ INNER JOIN ★1 dtb_product_category d2_ ON d0_.id = d2_.product_id AND d2_.discriminator_type IN ('productcategory') INNER JOIN dtb_category d3_ ON d2_.category_id = d3_.id AND : [省略] : WHERE ★2(d0_.product_status_id = 1 AND d2_.category_id IN (158) AND d1_.visible = 1) AND d0_.discriminator_type IN ('product') GROUP BY d0_.id ORDER BY sclr_9 ASC, d0_.id DESC [改造後のSQL] : [省略] : FROM dtb_product d0_ INNER JOIN ★1 (SELECT a.category_id, a.product_id, a.discriminator_type FROM ★1 (SELECT * FROM dtb_product_category WHERE category_id = 158) a, ★1 (SELECT * FROM dtb_product_category WHERE category_id = 11) b, ★1 (SELECT * FROM dtb_product_category WHERE category_id = 22) c ★1 WHERE ★1 a.product_id = b.product_id and ★1 a.product_id = c.product_id and ★1 b.product_id = c.product_id ★1 ) AS d2_ ON d0_.id = d2_.product_id AND d2_.discriminator_type IN ('productcategory') INNER JOIN dtb_category d3_ ON d2_.category_id = d3_.id AND : [省略] : WHERE ★2(d0_.product_status_id = 1 AND d1_.visible = 1) AND d0_.discriminator_type IN ('product') GROUP BY d0_.id ORDER BY sclr_9 ASC, d0_.id DESC |
468 |
投稿日時: 2021/6/30 11:43
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 商品一覧の検索処理の変更について ProductRepository.php->getQueryBuilderBySearchData()の内容ですが
カテゴリに関連する商品を取得するロジックは以下のように記述されており 元々in句に対応しているかと思います。
以下の一文で指定されたカテゴリの子カテゴリも含めた配列を作っているようです。 $Categories = $searchData['category_id']->getSelfAndDescendants(); ここで複数のカテゴリを処理して $Categoriesの内容を追加すれば クエリビルダ(SQLの組み立て)までは変更しなくても良いのではないかと思います。
|
BlackBox |
投稿日時: 2021/7/2 17:23
対応状況: −−−
|
新米 登録日: 2021/6/28 居住地: 投稿: 2 |
Re: 商品一覧の検索処理の変更について 468様
コメントありがとうございます。 >カテゴリに関連する商品を取得するロジックは以下のように記述されており >元々in句に対応しているかと思います。 当方の説明がへたくそで申し訳ありません。 いずれかのカテゴリに一致したでなく、全てのカテゴリに一致した商品を 一覧表示したいと考えております。(IN句では、対応できないと考えております) 以下のような使い方を想定しており、商品ごとに次のようなカテゴリがあるとします。 親カテゴリ:ゲームメーカー名 子カテゴリ:対応機種 孫カテゴリ:ゲームジャンル 上記の場合、親カテゴリが増えるごとに、カテゴリを大量に追加する必要があります。 (子が4種、孫が10種あった場合、親1に対し40種のカテゴリを追加する必要がある) そこで、親、子、孫カテゴリを紐づけずバラで登録し、商品側も3カテゴリずつ登録します。 そして、検索時にその3つが全て一致したものを抽出し一覧作成することで、カテゴリの 増加を抑えたいと考えております。 現状、無理矢理ではありますが、既存処理の一覧取得SQL発行前に独自で直接SQLを発行(PDO使用)し、 全カテゴリマッチした商品IDを取得、その情報で再抽出する方法で処理自体は実現できました。 ただ、直接SQLを発行することに問題はないのか疑問があり、可能なら最初に投稿した★1の SQLを発行する方法が知りたいと考えております。 以上、ご確認よろしくお願いします。 |
468 |
投稿日時: 2021/7/7 11:04
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: 商品一覧の検索処理の変更について >いずれかのカテゴリに一致したでなく、全てのカテゴリに一致した商品を
>一覧表示したいと考えております。(IN句では、対応できないと考えております) 私が内容を読み取れていなかったみたいで 見当違いな回答をしてしまい申し訳ございません。 (複数カテゴリIDのand検索をしたいという事でよろしいかったでしょうか?) リンク先のページは2013年の内容なのでかなり古いのですが doctrine自体がform句のサブクエリには対応していないのではないでしょうか? https://github.com/doctrine/orm/issues/3542 その為、直接SQLを発行する形でしか対応できないのではないかと思います。 直接SQLを発行する事については、SQLインジェクション対策を踏まえて単純な文字連結でSQLを組み立てなければ大丈夫ではないかと思います。 (特にカテゴリIDは外部から渡される値になるかと思いますのできちんと処理する必要があると思います) その他の方法として、where句でexistsとサブクエリを組み合わせて絞り込む(相関副問合せ)方法もあるかと思いますが doctrineでの記述となると かなり複雑な記述になりそうな気がします。
|
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |