バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > その他 > 「購入処理中」の受注情報を削除したい

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2024/6/25 17:38
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1912
「購入処理中」の受注情報を削除したい
EC-CUBE 4.0.5
PHP 7.4.16

古い「購入処理中」の受注情報を削除したいです。

Command ファイルを作成して、次のように実装しました。
ローカルMacOSのMAMP環境では問題なく実行できたのですが、同じプロジェクトのさくらクラウドのLinux環境で実行すると、FKエラーが発生してしまいます。
なぜだかわかりますでしょうか?

app/Customize/Command/OrderDeleteCommand.php

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);

        // タイムアウトを無効にする.
        set_time_limit(0);
        ini_set('memory_limit', '8G');

        $this->entityManager->getConfiguration()->setSQLLogger(null);
        // $this->entityManager->getConnection()->beginTransaction();

        try {
            $loop_count_success = 0;

            // 更新日時が3ヶ月以上前の「購入処理中」「決済処理中」の受注データ            
            $qb = $this->orderRepository->createQueryBuilder('o')
                ->select('o, s, oi')
                ->leftJoin('o.OrderItems', 'oi')
                ->innerJoin('o.Shippings', 's');

            $statuses = $this->orderStatusRepository->findBy(['id' => [OrderStatus::PROCESSING, OrderStatus::PENDING]]);
            $qb->andWhere($qb->expr()->in('o.OrderStatus', ':status'))
                ->setParameter('status', $statuses);

            $update_date_end = (new \DateTime())->modify('-'.$this->eccubeConfig['eccube_order_delete_days'].' days')->modify('+1 days');
            $qb->andWhere('o.update_date < :update_date_end')
                ->setParameter('update_date_end', $update_date_end);

            $qb->orderBy('o.id', 'ASC');
            
            $qb->setMaxResults(20); // メモリーリーク対策

            $Orders = $qb->getQuery()->getResult();
            while (count($Orders) > 0) {
                foreach ($Orders as $Order) {
                    $order_id = $Order->getId();
                    // $YamatoOrder = $Order->getYamatoOrder();
                    // if ($YamatoOrder) {
                    //     $Order->setYamatoOrder(null);    // Call to a member function getMemo03() on null エラーになる
                    //     $this->entityManager->remove($YamatoOrder);
                    // }
                    $MailHistories = $Order->getMailHistories();
                    if ($MailHistories && count($MailHistories) > 0) {
                        foreach ($Order->getMailHistories() as $MailHistory) {
                            $Order->removeMailHistory($MailHistory);
                            $this->entityManager->remove($MailHistory);
                        }
                    }
                    foreach ($Order->getShippings() as $Shipping) {
                        foreach ($Shipping->getOrderItems() as $OrderItem) {
                            $Shipping->removeOrderItem($OrderItem);
                            $this->entityManager->remove($OrderItem);
                        }
                        $Order->removeShipping($Shipping);
                        $this->entityManager->remove($Shipping);
                    }
                    $this->entityManager->remove($Order);
                    $this->entityManager->flush();

                    log_info('受注情報削除', ['order_id' => $order_id]);
                    $io->success(date('Y-m-d H:i:s',time()) . ' (order_id:' . $order_id . ')');

                    $loop_count_success++;
                }

                $Orders = $qb->getQuery()->getResult();
                break;
            }
            // $this->entityManager->flush();
            // $this->entityManager->getConnection()->commit();
            $io->success(date('Y-m-d H:i:s',time()) . ' (count:' . $loop_count_success . ')');
        } catch (\Exception $e) {
            // $this->entityManager->getConnection()->rollback();
            $io->error($e->getMessage());
        }
    }


[ERROR] An exception occurred while executing 'DELETE FROM dtb_order WHERE id = ?' with params
[400031]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent
row: a foreign key constraint fails (`ec`.`dtb_order_item`, CONSTRAINT
`FK_A0C8C3ED8D9F6D38` FOREIGN KEY (`order_id`) REFERENCES `dtb_order` (`id`))
tattsu
投稿日時: 2024/6/25 17:40
対応状況: −−−
仙人
登録日: 2023/12/23
居住地:
投稿: 387
Re: 「購入処理中」の受注情報を削除したい
Shippingに紐づいていない手数料などのOrderItemを消していないためかもしれないですね。


----------------
-------------------

各決済会社3Dセキュア実装・EC-CUBEバージョンアップ・不具合修正
お任せください。ゴールドパートナー。

h_tanaka
投稿日時: 2024/6/25 17:45
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1912
Re: 「購入処理中」の受注情報を削除したい
tattsu さん

ご回答ありがとうございます!

そちらを追加してみましたが、同じエラーになりました。。


                    foreach ($Order->getOrderItems() as $OrderItem) {
                        $Order->removeOrderItem($OrderItem);
                        $this->entityManager->remove($OrderItem);
                    }


[ERROR] An exception occurred while executing 'DELETE FROM dtb_order WHERE id = ?' with params
[400086]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent
row: a foreign key constraint fails (`ec`.`dtb_order_item`, CONSTRAINT
`FK_A0C8C3ED8D9F6D38` FOREIGN KEY (`order_id`) REFERENCES `dtb_order` (`id`))


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

h_tanaka
投稿日時: 2024/6/27 18:27
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1912
Re: 「購入処理中」の受注情報を削除したい
無理やりなやり方ではありますが、処理前に foreign key のチェックを外す方法はないでしょうか。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

h_tanaka
投稿日時: 2024/6/28 11:29
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1912
Re: 「購入処理中」の受注情報を削除したい
こちらで、処理前に foreign key のチェックを外すことができました。


$this->entityManager->getConnection()->exec('SET FOREIGN_KEY_CHECKS = 0;');


その後、受注情報の削除に成功しました。
目的が達成できたため、とりあえず本件は解決済みとします。


複数のテーブルから参照されているテーブルのレコード(Entity)を削除するとFKエラーが発生してしまうのはどうにか回避できないものですかね...。

Order  ← 削除するとFKエラーが発生する
┣ Shipping
┗━┻ OrderItem


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

h_tanaka
投稿日時: 2024/6/28 12:51
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1912
Re: 「購入処理中」の受注情報を削除したい
この掲示板の問題と思いますが、本投稿を解決済みに変更しようとすると拒否されてしまうようです。

Sorry, you have been blocked
You are unable to access ec-cube.net


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

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


 



ログイン


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

統計情報

総メンバー数は98,688名です
総投稿数は112,043件です

投稿数ランキング

1
seasoft
7369
2
468
3217
3
AMUAMU
2712
4
nanasess
2325
5
umebius
2085
6
h_tanaka
1912
7
yuh
1899
8
mcontact
1596
9
red
1575
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
805
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
balisys
502


ネットショップの壺

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

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