【问题标题】:Duplicate entry on loop an ArrayCollection (One To Many Entity)循环上的重复条目 ArrayCollection(一对多实体)
【发布时间】:2017-11-24 11:12:00
【问题描述】:

我有一个标签集合,每个标签都有一个映射集合(一对多关系)。问题是,当我尝试循环这个映射集合,然后刷新我的实体管理器时,会创建所有标签的副本,我不明白为什么。

这是带有批量大小的代码。第一个 foreach 循环标签集合,然后我得到这个标签的所有映射。然后,我在 foreach 上刷新我得到一个异常,但如果我在最后(在 for 之后)只刷新一次,它就可以工作。你能帮我么?

这是一个例外:

使用参数 ["Test 1"] 执行“INSERT INTO tag (name) VALUES (?, ?, ?)”时发生异常: SQLSTATE[23000]:完整性约束违规:1062 键 'UNIQ_C09225D35E237E06' 的重复条目 'Test 1'

代码如下:

            $batchSize = 100; //Entity Manager will flush every batchSize times
            $i = 0;

            foreach ($aTagCollection as $oTag) {
                $aMapping = $oTag->getMapping();

                foreach ($aMapping as $oMapping) {   

                }

                if (($i % $batchSize) === 0) {
                    $this->em->flush(); //Execute all updates every 100 times
                    $this->em->clear(); //Detaches all objects from Doctrine
                }

                $i++;
            }

            $this->em->flush();

实体标签

   /** @ORM\OneToMany(targetEntity="Mapping", 
        mappedBy="customerLabel", fetch="EXTRA_LAZY", 
        cascade={"persist"}, orphanRemoval=true)
    */
    private $mapping;


    public function __construct()
    {
        $this->mapping = new ArrayCollection();
    }


    public function addMapping(Mapping $mapping)
    {
        $this->mapping[] = $mapping;

        return $this;
    }


    public function removeMapping(Mapping $mapping)
    {
        $this->mapping->removeElement($mapping);
    }


    public function getMapping()
    {
        return $this->mapping;
    }

以及实体映射:

    /**
     * @ORM\ManyToOne(targetEntity="Tag", inversedBy="mapping", cascade={"persist"})
     * @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="CASCADE")
     */
  private $tag;

  public function setTag(Tag $tag = null)
    {
        $this->tag= $tag;

        return $this;
    }

    public function getTag()
    {
        return $this->tag;
    }

非常感谢!

【问题讨论】:

  • 我在你的代码中没有看到任何 persist() 只是 flush()
  • 因此我不明白为什么要创建所有标签的副本...我只有一个冲洗和两个 foreachs,仅此而已

标签: php symfony exception doctrine arraycollection


【解决方案1】:

客户标签?

/** @ORM\OneToMany(targetEntity="Mapping", 
    mappedBy="tag", fetch="EXTRA_LAZY", 
    cascade={"persist"}, orphanRemoval=true)
*/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2022-01-19
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2021-09-18
    • 2014-07-30
    相关资源
    最近更新 更多