【发布时间】:2017-08-03 12:26:05
【问题描述】:
我有一个 Article 和 Tags 实体。
我想创建表单来编辑Article 和相关的Tags。 (还有很多其他的关系,但现在这并不重要)
就我而言,添加新标签效果很好。但是如果我想删除一些标签,或者编辑现有的,这不会发生,我没有收到错误。据我所知$em->flush() 应该可以解决这一切,但事实并非如此。
我还检查了我的引擎——它是 InnoDB。我已经创建了外键。
对于编辑标签,我使用TextType::class。所以如果我想删除一个标签,我应该从这个列表中删除它。
click to see tag input
表单元素
$builder->add($builder->create('custom_tags', TextType::class, [])->addModelTransformer(function(){/*to array*/}, function(){/*to string*/} );
我按照文档所述将这些实体捆绑起来:
文章实体:
/**
* Article entity
*
* @ORM\Table(name="Article")
* @ORM\Entity
*/
class Article
{
/**
* Article can have zero or more tags
*
* @OneToMany(targetEntity="Tag", mappedBy="article",
* cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $tags;
public function __construct() {
$this->tags = new ArrayCollection();
}
public function setTags($tags) {
$currTags = $this->getTags();
....
// calculating the difference between currTags and ModifiedTags
//here I got ArrayCollection with new tags entities list, without already deleted tags
$this->tags = $tags;
return $this;
}
public function getTags() {
return $this->tags->matching(Criteria::create()->orderBy(["id" => Criteria::DESC]);
}
...
标记实体
/**
* Tag
*
* @ORM\Table(name="Tag")
* @ORM\Entity
*/
class Tag
{
/**
* @var Article
*
* Many Tags can be present in one article.
*
* @ManyToOne(targetEntity="Article", inversedBy="tags")
* @JoinColumn(name="article_id", referencedColumnName="id")
*/
private $article;
...
我花了很多时间来查找信息并解决此问题... 任何人都可以提供一些建议,告诉我我错过了什么或提供一些链接吗?我应该手动实现 remove_action 还是明确指定此操作?谢谢!
【问题讨论】:
-
你在
Tag实体中添加了setArticle($article)函数吗? -
也许你应该在你的学说配置文件中使用“on cascade delete”。
-
@Mintho433,你是什么意思?我应该在哪里配置它?我没有说,但是当我在表单中编辑文章字段时,标签记录会从表中删除...
-
@DrKey ,是的,我用过。
-
谁能解释我如果我有实体的arrayCollection。然后我删除了一个实体,然后调用了flush函数。表格中的相应行会被删除吗?
标签: symfony doctrine one-to-many formbuilder symfony-2.8