我有一个名为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中执行此操作的正确方法是什么?
答案 0 :(得分:2)
在循环
之后尝试$ em-> flush()foreach ($menu->getCategories() as $category) {
foreach ($category->getProducts() as $product) {
$em->persist($product);
}
$em->persist($category);
}
$em->flush();
答案 1 :(得分:0)
首先,当您更新记录或删除时,不需要保留记录,只需拨打$em->remove($object);
然后$em->flush();
即可
其次,您可以通过编码来完成,但我建议让删除由Doctrine完成;在这种情况下,您只需要更改映射并使用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();