我有一个名为Menu的实体,它包含Category实体的集合,它包含Product实体的集合。
$menu->fillMenu($categoriesData);
$categoriesData
包含数组中的所有类别和产品。fillMenu
功能是更新类别和产品,添加新类别和产品以及删除不在$categoriesData
中的类别和产品。但这个函数只作用于内存中的集合,而不作用于数据库。所以我添加了代码:
foreach ($menu->getCategories() as $category) {
foreach ($category->getProducts() as $product) {
$em->persist($product);
}
$em->persist($category);
}
$em->flush();
现在所有更新的和新的类别和产品都保存在数据库中,但如何删除fillMenu
功能删除的类别和商品?是否有可能从集合中引用已删除的对象,然后代码为:
$em->remove($deletedCategory);
编辑
我认为,我应该返回fillMenu
函数要删除的所有实体。然后对它们进行迭代并执行$em->remove($entity)
。但我觉得这不是很好的方式。您认为,在Symfony2中执行此操作的正确方法是什么?
循环后尝试$em->flush()
foreach ($menu->getCategories() as $category) {
foreach ($category->getProducts() as $product) {
$em->persist($product);
}
$em->persist($category);
}
$em->flush();
首先,当您更新或删除记录时,不需要持久化它,只需调用$em->remove($object);
,然后调用$em->flush();
即可
第二,你可以通过编码来完成,但我建议让删除由条令来完成;在这种情况下,您只需要更改映射并使用onDelete="CASCADE"
由于我不知道你的地图,我可以提供一些样本:
/**
* @ORM'ManyToOne(targetEntity="Category")
* @ORM'JoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $category;
现在,当你运行以下代码时,你的子产品也会被删除
foreach ($menu->getCategories() as $category) {
$em->remove($category);
}
$em->flush();