即使对象被正确更新,数据似乎也没有持久化,我不明白为什么。
这是我的实体:
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
。如果您查看您的映射,您将很容易注意到Article
和AttributeInArticole
之间的关系属于后者。
在执行刷新操作时,出于性能考虑,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"}
* )
*/
阅读原则文档:与协会合作。同时检查"孤儿移除"