即使对象被正确更新,似乎数据也不会持久存在,我也不明白为什么。
这是我的实体:
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已被删除。
但由于某种原因,它不会持续存在这些数据。
答案 0 :(得分:6)
答案很简单。
您要从Attribute
和持久/刷新Article
中删除Article
。如果您查看映射,您会很容易注意到Article
和AttributeInArticole
之间的关系归后者所有。
当你执行刷新操作时,由于性能原因,学说“看起来”仅仅是拥有关系的一方并改变它:如果没有任何改变,就不需要在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"