【问题标题】:Symfony2 Form works bad(Related oneToMany entities are not deleted)Symfony2 表单效果不佳(相关的 oneToMany 实体未删除)
【发布时间】:2017-08-03 12:26:05
【问题描述】:

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

【问题讨论】:

  • 你在Tag实体中添加了setArticle($article)函数吗?
  • 也许你应该在你的学说配置文件中使用“on cascade delete”。
  • @Mintho433,你是什么意思?我应该在哪里配置它?我没有说,但是当我在表单中编辑文章字段时,标签记录会从表中删除...
  • @DrKey ,是的,我用过。
  • 谁能解释我如果我有实体的arrayCollection。然后我删除了一个实体,然后调用了flush函数。表格中的相应行会被删除吗?

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


【解决方案1】:

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

一旦 ArrayCollection 被实体管理器持久化和管理 它变成了一个 PersistentCollection 它的行为完全有一个 数组集合 (got from here???)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2019-07-09
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多