如何更新symfony2中的实体集合?

时间:2014-04-11 15:23:10

标签: php symfony

我有一个名为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中执行此操作的正确方法是什么?

2 个答案:

答案 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();