php - Symfony 原则多对多完整性约束违规 : 1062 Duplicate entry

标签 php symfony doctrine-orm

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

/**
     * @Serializer\Expose()
     * @ORM\ManyToMany(targetEntity="User")
     * @ORM\JoinTable(name="user_referent",
     *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *  inverseJoinColumns={@ORM\JoinColumn(name="coach_id", referencedColumnName="id")}
     * )
     * @ORM\JoinColumn(nullable=true)
     * @Assert\Valid
     *
     */
    private $coaches;

在测试期间,当我尝试创建重复条目时,我收到来自 sql 的正确消息(SQLSTATE[23000]:完整性约束违规:1062 重复条目。) 但我想在冲水之前捕获重复的东西。所以我在add函数中添加了一条if语句。

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

    }

但是似乎在使用表单时,没有调用addCoach函数。当我转储它时,没有任何值(value)被转储。 我尝试了 @Assert\Valid@Unique 或对 @Table 的约束...但没有任何效果。 有没有办法设置多对多关系的约束并像实体的任何其他项目一样抛出消息?

最佳答案

仅当您在保留用户实体之前显式调用该方法以在用户实体上添加教练时,才会调用 addCoach 方法。它不会被隐式调用。

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

使用以下内容更新您的用户实体的学说 orm 文件。

<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]);
            }     
        }           
    }

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

关于php - Symfony 原则多对多完整性约束违规 : 1062 Duplicate entry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48410217/

相关文章:

Symfony 3 DateTimeType 表单字段带有可选的时间组件

php - Symfony2 OAuth2 提供程序错误 UserRepository

PHP - 在 MVC 中在哪里实现 session 逻辑?

php - 仅在调用时刷新 PHP 页面一次

mysql - symfony2 : An exception occured in driver: SQLSTATE[HY000] [1049] 中的 MySQL (PDO) 错误

symfony - 错误 : Serialization for the format json is not supported

symfony - FOS UserBundle 无法登录

php - Doctrine、命名空间和自动加载实体

php - MySQL 选择用户座右铭

php - 为什么 PHP 在使用::class 时不抛出 class not found 错误?