Doctrine ArrayCollection删除元素不起作用

时间:2015-09-04 10:37:08

标签: php symfony doctrine-orm

即使对象被正确更新,似乎数据也不会持久存在,我也不明白为什么。

这是我的实体:

  

Article.php

bar.updateData = function(val) {
  return $http.put('url/foo', { param: val })
    .then(function(res) {
      return res.data;
    })
    .catch(function(error) {
      return 'this is a string';
    });
};
  

AttributeInArticle.php

/**
 * @var AttributeInArticle
 *
 * @ORM\OneToMany(
 *      targetEntity="XXX\DatabaseBundle\Entity\AttributeInArticle",
 *      mappedBy="article"
 * )
 */
private $attributeInArticles;

....

public function __construct()
{
    $this->attributeInArticles = new ArrayCollection();
}


/**
 * @return AttributeInArticle
 */
public function getAttributeInArticles()
{
    return $this->attributeInArticles;
}

public function addAttributeInArticle(AttributeInArticle $attributeInArticles)
{
    $this->attributeInArticles[] = $attributeInArticles;

    return $this;
}

public function removeAttributeInArticle(AttributeInArticle $attributeInArticles)
{
    $this->attributeInArticles->removeElement($attributeInArticles);
}

在控制器中,我这样称呼它:

/**
 * @var  Attribute
 *
 * @ORM\ManyToOne(
 *      targetEntity="XXX\DatabaseBundle\Entity\Attribute",
 *      inversedBy="attributeInArticles"
 * )
 * @ORM\JoinColumns({
 *     @ORM\JoinColumn(
 *          name="attribute_id",
 *          referencedColumnName="id")
 * })
 */
private $attribute;

/**
 * @var Article
 *
 * @ORM\ManyToOne(
 *      targetEntity="XXX\DatabaseBundle\Entity\Article",
 *      inversedBy="attributeInArticles"
 * )
 * @ORM\JoinColumns({
 *       @ORM\JoinColumn(
 *          name="article_id",
 *          referencedColumnName="id"
 *      )
 * })
 *
 */
private $article;

/**
 * @return Attribute
 */
public function getAttribute()
{
    return $this->attribute;
}

/**
 * @param Attribute $attribute
 */
public function setAttribute($attribute)
{
    $this->attribute = $attribute;
}

+ getter & setter for $article

如果我在删除操作之前和之后转储$ article对象,则$ article对象中包含corect数据。这意味着$ attributeInArticle已被删除。

但由于某种原因,它不会持续存在这些数据。

2 个答案:

答案 0 :(得分:6)

答案很简单。

您要从Attribute和持久/刷新Article中删除Article。如果您查看映射,您会很容易注意到ArticleAttributeInArticole之间的关系归后者所有。

当你执行刷新操作时,由于性能原因,学说“看起来”仅仅是拥有关系的一方并改变它:如果没有任何改变,就不需要在db中编写它。

因此,您可以在此处执行的操作是直接删除$attributeInArticle,而无需担心Article实体。

所以,基本上

$em = $this
    ->getDoctrine()
    ->getManager();

$em->remove($attributeInArticle);
$em->flush();

另一种选择是在$attribueInArticles实体的Article上使用orphanRemoval

所以,基本上,

//Article.php

/**
 * @var AttributeInArticle
 *
 * @ORM\OneToMany(
 *      targetEntity="XXX\DatabaseBundle\Entity\AttributeInArticle",
 *      mappedBy="article",
 *      orphanRemoval=true
 * )
 */
private $attributeInArticles;

$article->removeAttributeInArticle($attributeInArticle);

答案 1 :(得分:0)

您需要cascade={"remove"}

/**
 * @var AttributeInArticle
 *
 * @ORM\OneToMany(
 *      targetEntity="XXX\DatabaseBundle\Entity\AttributeInArticle",
 *      mappedBy="article",
 *      cascade={"remove"}
 * )
 */

阅读学说文档:8. Working with Associations。同时检查" Orphan Removal"