2015-09-04 39 views
3

即使对象被正确更新,似乎数据不会持久,我不明白为什么。原则ArrayCollection删除元素不工作

这里是我的实体:

Article.php

​​

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 

和Controller我叫它像这样:

$article->removeAttributeInArticle($attributeInArticle); 

如果我在$ remove对象前后移除$ article对象,$ article对象在其中包含corect数据。这意味着$ attributeInArticle已被删除。

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

+0

你叫坚持()和flush()之后? –

+0

是的。我最终去除了物体本身...所以现在它的工作,但它不工作作为一个真正的ArrayCollection –

回答

5

答案很简单。

您将从Article和持续/冲洗Article中删除Attribute。如果你看看你的映射,你会很容易注意到后者拥有ArticleAttributeInArticole之间的关系。

当您执行冲洗操作时,出于性能方面的原因,“看起来”仅仅是为了拥有关系的一面并对其进行更改:如果没有更改,则无需将其写入分贝。

那么,你可以在这里做什么,是直接删除$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); 
+1

这正是我到底做了什么:)我会接受这是因为广泛解释为什么这是如此,而不是不同!谢谢! –

0

你需要cascade={"remove"}

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

读主义文档:8. Working with Associations。另外检查“孤儿删除”