【问题标题】:How to update collections of entities in symfony2?如何更新 symfony2 中的实体集合?
【发布时间】:2014-04-12 00:14:51
【问题描述】:

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

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    在循环后尝试 $em->flush()

    foreach ($menu->getCategories() as $category) {
            foreach ($category->getProducts() as $product) {
                $em->persist($product);
            }
            $em->persist($category);
        }
    
    $em->flush();
    

    【讨论】:

    • 有$em->flush();我没有粘贴。
    【解决方案2】:

    首先,当您更新或删除记录时,您不需要保留它,只需调用$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();
    

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      相关资源
      最近更新 更多