Symfony2表单工作正常(相关的oneToMany实体未删除)

时间:2017-08-03 12:26:06

标签: symfony doctrine one-to-many formbuilder symfony-2.8

我有一个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还是明确指定此操作?谢谢!

1 个答案:

答案 0 :(得分:0)

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

  

一旦ArrayCollection由实体管理器持久化和管理   它变成了PersistentCollection,它的行为恰好具有   的ArrayCollection   (got from here???)

在Article类中,Doctrine \ ORM \ PersistentCollection的哪个实例改为$ this-> getTags() - 一切都开始运行良好。 所以现在我需要了解Doctrine \ ORM \ PersistentCollection和ArrayCollection之间的区别