Doctrine ArrayCollection移除不工作的元素


Doctrine ArrayCollection remove element not working

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

这是我的实体:

Article.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);
}

AttributeInArticle.php

/**
 * @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->removeAttributeInArticle($attributeInArticle);

如果我在删除操作之前和之后转储$article对象,则$article对象中有正确的数据。这意味着$attributeInArticle被删除了。

但是由于某些原因,它没有保存这个数据

答案很简单。

您正在从Article和持久化/冲洗Article中删除Attribute。如果您查看您的映射,您将很容易注意到ArticleAttributeInArticole之间的关系属于后者。

在执行刷新操作时,出于性能考虑,doctrine只"查看"关系的拥有方以及关系的更改:如果没有更改,则不需要将其写入db。

所以,你在这里可以做的是,直接删除$attributeInArticle而不用担心Article实体。

基本上

,

$em = $this
    ->getDoctrine()
    ->getManager();
$em->remove($attributeInArticle);
$em->flush();

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

,

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

$article->removeAttributeInArticle($attributeInArticle);

您需要cascade={"remove"}

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

阅读原则文档:与协会合作。同时检查"孤儿移除"