Symfony2 表单效果不佳(相关的 oneToMany 实体未被删除)

Symfony2 Form works bad(Related oneToMany entities are not deleted)

我有一个 ArticleTags 个实体。 我想创建表单来编辑 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 还是明确指定此操作?谢谢!

我注意到 getTags() 函数 returns ArrayCollection。 这很好。但我也在 setTags() 中调用 getTags() 来计算 currTags 和 ModifiedTags 之间的差异。 所以我正在对 ArrayCollection 实例进行更改。 但是当我开始使用 $this->tags

Once an ArrayCollection is persisted and managed by the entity manager it becomes a PersistentCollection it behaves exactly has an ArrayCollection (got from here???)

Doctrine\ORM\PersistentCollection 的哪个实例代替文章 class 中的 $this->getTags() - 一切都开始运行良好。 所以现在我需要阅读 Doctrine\ORM\PersistentCollection 和 ArrayCollection

之间的区别