バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 商品の購入回数の取得について

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
wa.shi
投稿日時: 2019/4/10 18:28
対応状況: 開発中
常連
登録日: 2018/2/20
居住地:
投稿: 34
商品の購入回数の取得について
毎々お世話になっております。

主題の件につきまして、

受注IDと会員IDを元に
商品の購入回数(個数は含めません)を取得したく思っております。

Query Builderというものを
用いてデータを抽出するのが良いのか
はたまた別の方法があるのか苦戦しております。

Query Builderに関しまして、
先程情報を入手したばかりで
いろいろな文献を読んでいるのですが、
複数の条件でできるのか理解しておらずで・・・。

かなり初歩的な質問となり
大変申し訳ございませんが、よろしくお願い致します。


EC-CUBE:3.0.17
DB:MySQL 5.6.15
PHP:5.6.35


以上、よろしくお願い致します。
468
投稿日時: 2019/4/10 18:52
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1685
Re: 商品の購入回数の取得について
目的のデータを整理して取り出すには、やはりQueryBuilderを使う事になるのではないかと思います。

最終的にどのような形態のデータを表示したいのかの要件によって、
記述の仕方が変わってくると思います。

例えば、会員詳細ページで商品毎の個数を表示したいのであれば、
顧客で絞り込んで、商品毎に件数を集計すれば良いと思いますし、
商品詳細ページで顧客毎の個数を表示したいのであれば、
商品で絞り込んで、顧客毎に件数を集計すれば良いと思います。


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

wa.shi
投稿日時: 2019/4/10 19:31
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 34
Re: 商品の購入回数の取得について
>>468様

早急なるご回答ありがとうございます。

実は用途と致しまして、
初回限定価格の商品を設けまして
購入回数を見て、
カートから削除するかどうかという
機能実装を試みております。

テーブルとしましては
dtb_productに
kaisu_limitという新項目を追加して
商品ごとの購入制限数の枠を設けております。
(ブランクの場合は無制限)

CartService.phpにて
function setProductLimit内に当該処理を追記予定でございます。

現在、下記が追記予定内容になります。
if文内の「実際の商品購入回数」の出し方に行き詰まっております。
ちなみに'cart.over.kaisu_limit'のエラーメッセージにつきましては
設定済みです。

引用:


$Product = $ProductClass->getProduct();

// 同一顧客購入回数制限(設定されていなければ0)
$kaisuLimit = $Product->getKaisuLimit();

if ($this->app->isGranted('ROLE_USER')) {
$Customer = $this->app->user();
if($kaisuLimit != "" && $kaisuLimit <= 実際の商品購入回数){
$limit = $kaisuLimit;
$this->addError('cart.over.kaisu_limit', $productName);
$this->removeProduct($ProductClass->getId());
return $limit;
}
}


やはりQueryBuilderを使用することになるのですね・・・。
私自身も今後調べますが、
まだ理解できておらず、
アドバイスや糸口をご教示頂けましたら、
非常に幸いでございます。

468
投稿日時: 2019/4/11 10:20
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1685
Re: 商品の購入回数の取得について
もし、私がカスタマイズする(本体カスタマイズ前提)のであれば、
/src/Eccube/Repository/OrderDetailRepository.phpにCustomerとProductを渡して、購入回数を返してもらうメソッドを追加すると思います。

OrderRepository.phpのfunction getCustomerCount()の記述が参考になるのではないかと思います。
getCustomerCountの中では、joinが行われていないので他のメソッドのjoinの記述を参考にすればよいかと思います。


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

wa.shi
投稿日時: 2019/4/11 10:43
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 34
Re: 商品の購入回数の取得について
ご回答ありがとうございます。

頂きました内容を元に
実装を試みようと思います。

完了次第ご連絡致します。
wa.shi
投稿日時: 2019/4/11 13:38
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 34
Re: 商品の購入回数の取得について
468様
お世話になっております。

お恥ずかしながら、
QueryBuilder初心者であり
大変苦戦しております。

いろいろ組んでみて
頭の中がこんがらがってしまいました・・・。

なにかヒント等ございましたら
ご教示頂けますと幸いでございます。

468
投稿日時: 2019/4/11 18:43
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1685
Re: 商品の購入回数の取得について
どういったカスタマイズをしようとして、どんな状態まで進んでいますか?

いきなり最終目的のデータを取得しようとせずに、まずは単純に注文詳細レコードの件数だけでも取得するようなQueryBuilderを記述されてみては如何でしょうか?
CategoryRepositoryのfunction getTotalCount()がシンプルかもしれません。

提示いただいたコードの
if($kaisuLimit != "" && $kaisuLimit <= 実際の商品購入回数){

の前に
実際の商品購入回数 = $this->entityManager->getRepository('Eccube\Entity\OrderDetail')->getCount($Product, $Customer);
if($kaisuLimit != "" && $kaisuLimit <= 実際の商品購入回数){

みたいな感じでリポジトリクラスに定義したメソッドは呼び出せるのではないかと思います。

getCountは、OrderDetailRepository.phpに定義してください。


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

wa.shi
投稿日時: 2019/4/12 10:39
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 34
Re: 商品の購入回数の取得について
468様
いつも大変お世話になっております。

ご回答いただきまして
誠にありがとうございます。

下記のようなSQL文をQueryBuilderに当てはめようと致しましたが
当てはめ方に大変苦戦致しました…。


引用:

select o.customer_id, od.product_id, count(*)
from dtb_order as o inner join dtb_order_detail as od
on o.order_id=od.order_id
group by o.customer_id, od.product_id


おっしゃる通り、
最終目的データを追いかけて
お恥ずかしながら混乱してしまいました。

ご提示頂きました一例を元に
シンプルに一度組んでみようと思います。

ご丁寧に記述頂き
誠に感謝です。
468
投稿日時: 2019/4/12 11:02
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 1685
Re: 商品の購入回数の取得について
提示いただいたソースでは、既に会員と商品が特定されていたと思いますのでSQLは以下のような感じになるかと思います。
SELECT count(*)
FROM dtb_order AS o 
INNER JOIN dtb_order_detail AS od ON o.order_id = od.order_id
WHERE o.customer_id = :customer_id AND od.product_id = :product_id;

WHEREでcustomer_id, product_idを指定してしまえば、
GROUPで集約した結果の1行分のレコードのみを取り出す事と同義になります。

もし、SQLには慣れておられるのであれば、
QueryBuilderでハマるかもしれないのはWHERE等のパラメータの渡し方かもしれません。
QueryBuilder(Doctrine)では、以下のような感じでWhere句を指定していきますが、
パラメータに渡す$Customerは、customer_idではなくCustomerエンティティのインスタンスである必要があります。
->andWhere('o.Customer = :Customer')
->setParameter('Customer', $Customer)

SQLで考えるとcustomer_idのカラムを条件に指定しようと考えてしまうかもしれませんが(私は最初そうでした)
上手くいかず、かなり悩みましたので...


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

wa.shi
投稿日時: 2019/4/12 13:42
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 34
Re: 商品の購入回数の取得について
468様

いつも大変お世話になっております。

本件、いろいろとご教示頂きましたおかげさまで
解決致しました!
誠にありがとうございます。

以下のQueryBuilderを
OrderDetailRepositoryにて追記致しました。

引用:

public function getOrderedCount(\Eccube\Entity\Product $Product, \Eccube\Entity\Customer $Customer)
{
$result = $this->createQueryBuilder('od')
->select('COUNT(od.Product)')
->innerJoin('od.Order', 'o')
->Where('od.Product = :Product')
->andWhere('o.Customer = :Customer')
->setParameter('Product', $Product)
->setParameter('Customer', $Customer)

->getQuery()
->getResult();

return $result;
}
}


ただし、実はまた別の問題が発生しまして…
販売回数制限を超えた際、
カートページにて
該当エラーメッセージが
表示され該当商品が削除される仕様に致しましたが、


販売回数制限を超えていない場合
購入ページにて、
リロードや支払い方法を選択すると
ページの再読み込みが起き、自動的に受注情報が更新され
同時購入回数も増え、
カートページに戻され、エラーとなってしまうように
なりました(><)

ひと難過ぎてまたひと難ですね。。
どうにか回避する方法を調査中でございます。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


ec-cube.co

統計情報

総メンバー数は42,320名です
総投稿数は90,794件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
1882
4
468
1685
5
yuh
1571
6
red
1245
7
umebius
1200
8
fukap
907
9
tsuji
837
10
shutta
827
11 ramrun 789
12
tao_s
699
13
h_tanaka
693
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
483
20 tonton 436


ネットショップの壺

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

Copyright© LOCKON CO.,LTD. All Rights Reserved.