バージョン選択

フォーラム

メニュー

オンライン状況

44 人のユーザが現在オンラインです。 (37 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 43
stomach もっと...

サイト内検索

質問 > フロント機能 > 商品一覧の検索処理の変更について

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
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句に対応しているかと思います。

// category
$categoryJoin = false;
if (!empty($searchData['category_id']) && $searchData['category_id']) {
    $Categories = $searchData['category_id']->getSelfAndDescendants();
    if ($Categories) {
        $qb
        ->innerJoin('p.ProductCategories', 'pct')
        ->innerJoin('pct.Category', 'c')
        ->andWhere($qb->expr()->in('pct.Category', ':Categories'))
        ->setParameter('Categories', $Categories);
        $categoryJoin = true;
    }
}


以下の一文で指定されたカテゴリの子カテゴリも含めた配列を作っているようです。
$Categories = $searchData['category_id']->getSelfAndDescendants();

ここで複数のカテゴリを処理して
$Categoriesの内容を追加すれば
クエリビルダ(SQLの組み立て)までは変更しなくても良いのではないかと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

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での記述となると
かなり複雑な記述になりそうな気がします。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は93,361名です
総投稿数は111,029件です

投稿数ランキング

1
seasoft
7369
2
468
3217
3
AMUAMU
2712
4
nanasess
2315
5
umebius
2085
6
yuh
1845
7
h_tanaka
1755
8
red
1574
9
mcontact
1463
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
804
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.