Shopware/Symfony问题:删除自定义订单项后仍留存于数据库
Shopware自定义订单项删除后仍留存数据库问题解决方案
问题核心
删除购物车中的主商品时,关联的自定义订单项在结账流程中已从购物车消失,但订单完成后,该自定义项仍会出现在order_line_item表中,与主商品删除后彻底消失的行为不符。
可能原因及解决方法
1. 购物车变更未正确持久化
你的代码中调用了cartService->remove移除订单项,但可能缺少手动持久化步骤,导致删除操作仅停留在内存中的购物车对象,未同步到数据库的临时购物车记录中。
修改代码,添加持久化操作:
在移除订单项后,调用cartPersister->save保存更新后的购物车:
#[Route(path: '/checkout/line-item/delete/{id}', name: 'frontend.checkout.line-item.delete', defaults: ['XmlHttpRequest' => true], methods: ['POST', 'DELETE'])] public function deleteLineItem(Cart $cart, string $id, Request $request, SalesChannelContext $context): Response { return Profiler::trace('cart::delete-line-item', function () use ($cart, $id, $request, $context) { try { if (!$cart->has($id)) { throw CartException::lineItemNotFound($id); } $engravingLineItemId = $this->engravingLineitemService->findEngravingLineItemId($cart, $id); if ($engravingLineItemId !== null) { $cart = $this->cartService->remove($cart, $engravingLineItemId, $context); } $cart = $this->cartService->remove($cart, $id, $context); // 关键:手动持久化购物车变更 $this->cartPersister->save($cart, $context); if (!$this->traceErrors($cart)) { $this->addFlash(self::SUCCESS, $this->trans('checkout.cartUpdateSuccess')); } } catch (\Exception $e) { $this->addFlash(self::DANGER, $this->trans('error.message-default')); } return $this->createActionResponse($request); }); }
2. 订单转换逻辑未过滤已删除项
Shopware创建订单时,会从购物车转换订单项,但自定义订单项可能因类型或关联关系,未被默认逻辑识别为已删除状态。此时可通过事件订阅者在订单保存前主动清理。
创建订单清理订阅者:
use Shopware\Core\Checkout\Cart\Order\CheckoutOrderBeforeSaveEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class OrderLineItemCleanupSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ CheckoutOrderBeforeSaveEvent::class => 'onOrderBeforeSave', ]; } public function onOrderBeforeSave(CheckoutOrderBeforeSaveEvent $event): void { $order = $event->getOrder(); $cart = $event->getCart(); // 获取当前购物车中存在的所有订单项ID $validLineItemIds = array_map(fn($item) => $item->getId(), $cart->getLineItems()->getElements()); // 过滤订单中不在购物车的订单项 $order->setLineItems( $order->getLineItems()->filter(fn($lineItem) => in_array($lineItem->getOriginalId(), $validLineItemIds)) ); } }
3. 自定义订单项类型配置错误
确保你的自定义订单项(如雕刻项)的type设置为custom而非product,Shopware对商品类型订单项的持久化逻辑更严格,自定义类型需单独处理删除同步。
调试验证步骤
- 删除订单项后,打印
$cart->getLineItems()确认自定义项已不存在 - 查看
cart_line_item表,确认删除操作已同步删除对应临时记录 - 订单创建前,通过
CheckoutOrderBeforeSaveEvent事件调试订单的lineItems列表
内容的提问来源于stack exchange,提问作者kevkall
相关产品推荐
相关产品推荐

