我有一个具有多对多(“自引用”)关系的实体用户。
/**
* @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/