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`))