Symfony 学说 多对多 完整性约束冲突:1062 重复条目



我有一个具有多对多("自引用"(关系的实体用户。

/**
     * @SerializerExpose()
     * @ORMManyToMany(targetEntity="User")
     * @ORMJoinTable(name="user_referent",
     *  joinColumns={@ORMJoinColumn(name="user_id", referencedColumnName="id")},
     *  inverseJoinColumns={@ORMJoinColumn(name="coach_id", referencedColumnName="id")}
     * )
     * @ORMJoinColumn(nullable=true)
     * @AssertValid
     *
     */
    private $coaches;

在测试期间,当我尝试创建重复条目时,我收到了来自sql(SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry.(的正确消息但我想在刷新之前捕获重复项。所以我在 add 函数中添加了一个 if 语句。

public function addCoach(User $coach)
    {
        if ($this->coaches->contains($coach)) {
            return;
        }
        $this->coaches[] = $coach;
    }

但似乎在使用窗体时,不会调用 addCoach 函数。当我转储它时,不会转储任何值。我尝试了@AssertValid@Unique或约束@Table...但没有任何效果。有没有办法设置约束多对多关系,像在实体的任何其他项目上一样抛出消息?

仅当您显式调用该方法以在持久化用户实体之前在用户实体上添加 coach 时,才会调用该方法。它不会被隐式调用。

您可以在用户实体中使用 onPrePersist 方法,这将是每次尝试将实体刷新到数据库中时检查重复项的隐式方法。

使用以下内容更新用户实体的原则或文件。

<lifecycle-callbacks>
   <lifecycle-callback type="prePersist" method="prePersist" />
</lifecycle-callbacks>

然后通过以下方式更新用户实体文件。

    /**
     * @PrePersist
     */
    public function onPrePersist()
    {
        // remove duplicates from coaches array.
        $coachKeys[] = array();
        foreach($this->coaches as $key => $coach) {
            if(!in_array($coach->getUserId(), $coachKeys) {
                $coachKeys[] = $key;
            } else {
               $this->removeCoach($this->coach); // unset($this->coache[$key]);
            }     
        }           
    }

这将确保它在刷新之前删除重复条目。

相关内容

  • 没有找到相关文章

最新更新