我有一个使用Doctrine 2.6管理数据库的Symfony3项目。
当我按Integrity constraint violation
方法调用remove
按特定顺序时出现EntityManager
错误。
我一直认为这个方法(以及persist
)无论在哪个实体传递给他们的顺序都能工作,我错了。
数据库在MySQL上运行,具有以下结构:
目标是删除Menu
实体。我已对案例进行了简化,因此Menu
仅与一个Offer
和一个Component
相关联。
优惠与菜单的Component
相关联。
所以它看起来像这样:
- Menu [#12 Menu Of the Day]
| - Component [#23 Dessert]
| | - Product [#14 Pineapple]
| - Offer [#42 Dessert only]
| | - Component [#23 Dessert]
| | | - Product [#14 Pineapple]
现在这是崩溃的代码:
$em = $this->doctrine->getManager();
$menu = $em->getRepository(Menu::class)->findOneBy(['ref' => 'V0dQ']);
// Remove menu components (ex: starter, dish, dessert, etc.)
$menuComponents = $menu->getComponents();
$menuComponent = $menuComponents[0];
$menu->removeComponent($menuComponent);
// Remove components products
$componentsProducts = $menuComponent->getComponentProducts();
$componentProduct = $componentsProducts[0];
$menuComponent->removeComponentProduct($componentProduct);
// Remove offers (ex: start + dish, dish + dessert, etc.)
$offers = $menu->getOffers();
$offer = $offers[0];
$menu->removeOffer($offer);
// Same as menu components
$offerComponents = $offer->getComponents();
$offerComponent = $offerComponents[0];
$offer->removeComponent($offerComponent);
// Everything MUST be persisted/removed in one place.
$em->remove($componentProduct);
$em->remove($menuComponent);
$em->remove($offer);
$em->remove($offerComponent);
$em->remove($menu);
$em->flush();
我的工作方式是在调用remove($menuComponent)
之后调用remove($offer)
,就像这样:
$em->remove($componentProduct);
$em->remove($offer);
$em->remove($menuComponent);
$em->remove($offerComponent);
$em->remove($menu);
这是问题的一个原始示例。实际上,我有一个非常复杂的“Api引擎”(如Api平台),其中所有内容都以通用方式处理。
我需要清楚地了解在将来为任何案例提取解决方案时会发生什么,这就是我要求你帮助的地方。
您是否看到一个简单的规则来确定哪个实体必须首先传递给remove()
?