バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

フロント機能

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
wa.shi
投稿日時: 2019/4/15 10:14
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 45
Re: 商品の購入回数の取得について
>>468様

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

週末挟み明けのご返信誠に恐縮です・・・。

確かに他のステータスにも
焦点を合わせるべきですね。

わざわざありがとうございます!
468
投稿日時: 2019/4/12 17:57
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 商品の購入回数の取得について
うまくいったという事で良かったです。

あとは、以下の'id'=>の記述を変更する事で他のステータスの受注も対象外にできるかと思いますので
必要があれば要件に合わせて変更してください。

->findNotContainsBy(array('id' => $this->app['config']['order_processing']));



->findNotContainsBy(array('id' => array($this->app['config']['order_processing'],
$this->app['config']['order_pending'],
$this->app['config']['order_cancel'],
$this->app['config']['order_back_order'])));


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

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

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

早速のご回答ありがとうございます!
ご教示頂きました内容を元に
ステータスに関する条件を追記致しましたところ、
非常にうまくいきました。

この度は手厚く
ご面倒頂きまして誠にありがとうございました!


   public function getOrderedCount(\Eccube\Entity\Product $Product, \Eccube\Entity\Customer $Customer)
    {
        // 購入処理中は該当処理を行わない
        $OrderStatuses = $this->getEntityManager()
            ->getRepository('Eccube\Entity\Master\OrderStatus')
            ->findNotContainsBy(array('id' => $this->app['config']['order_processing']));
        
        $qb = $this->createQueryBuilder('od');
        
        $result = $qb
                       ->select('COUNT(od.Product)')
                       ->innerJoin('od.Order', 'o')
                       ->Where('od.Product = :Product')
                       ->andWhere('o.Customer = :Customer')
                       ->andWhere($qb->expr()->in('o.OrderStatus', ':status'))
                        
                       ->setParameter('Product', $Product)
                       ->setParameter('Customer', $Customer)         
                       ->setParameter('status', $OrderStatuses)
            
                       ->getQuery()
                       ->getResult();

        return $result;
    }
}
468
投稿日時: 2019/4/12 14:32
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 商品の購入回数の取得について
whereにOrderStatusを追加する事で問題を解決できると思います。
OrderRepositry内にin notを使って判定している(管理画面の受注一覧の検索処理)ところがあると思いますので
そちらを参考にすれば良いかと思います。
注文完了までの操作時には、購入処理中のステータスの受注データが追加されていると思います。


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

wa.shi
投稿日時: 2019/4/12 13:42
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 45
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;
}
}


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


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

ひと難過ぎてまたひと難ですね。。
どうにか回避する方法を調査中でございます。
468
投稿日時: 2019/4/12 11:02
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
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 10:39
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 45
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/11 18:43
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
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/11 13:38
対応状況: −−−
常連
登録日: 2018/2/20
居住地:
投稿: 45
Re: 商品の購入回数の取得について
468様
お世話になっております。

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

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

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

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

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

完了次第ご連絡致します。
(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は88,288名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
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.