如何更新symfony2中的实体集合


How to update collections of entities in symfony2?

我有一个名为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();