删除实体

时间:2018-01-05 23:29:13

标签: php mysql doctrine-orm foreign-keys relational-database

我有一个使用Doctrine 2.6管理数据库的Symfony3项目。

当我按Integrity constraint violation方法调用remove 按特定顺序时出现EntityManager错误。

我一直认为这个方法(以及persist)无论在哪个实体传递给他们的顺序都能工作,我错了。

数据库在MySQL上运行,具有以下结构:

Database schema

目标是删除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()

0 个答案:

没有答案