如何避免SQL Api-平台(Symfony)中重复条目的异常?

How to avoid SQL Exception of duplicated entry in Api-platform (Symfony)?

我正在使用 Symfony 5.3 + Api-platform 并且我有一个 User 实体,它有 3 个唯一索引验证器。

它们被标记为@UniqueEntity。

...
* @UniqueEntity({"email", "anonymousGuid", "qrcode" })
 */
class User implements UserInterface, PasswordAuthenticatedUserInterface
{

这些属性也被标记为 unique=true。即:

/**
 * @ORM\Column(type="string", length=180, unique=true, nullable=true)
 * @Groups ({"user_read","user_write"})
 * @Assert\Email
 */
private $email;

但是,当尝试使用 api 插入新用户时,它会抛出 SQL 异常,而不是以正确的 API 格式显示异常。

{
  "@context": "/contexts/Error",
  "@type": "hydra:Error",
  "hydra:title": "An error occurred",
  "hydra:description": "An exception occurred while executing a query: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'string' for key 'UNIQ_8D93D649A4FF23EC'",

我是不是漏掉了什么?

我真的需要添加一个 manual validation 吗?

在此处阅读 UniqueEntity 的文档:
https://symfony.com/doc/current/reference/constraints/UniqueEntity.html#fields
看起来默认选项是单个字段名称的字符串。要传递字段数组,我 认为 您需要指定选项键:

// DON'T forget the following use statement!!!
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @UniqueEntity(fields={"email", "anonymousGuid", "qrcode"})
 */

注意:

上述用法要求这些字段中的值组合是唯一的,如果其他字段之一不同,则允许再次使用电子邮件。如果您希望每个用户的每个字段都是唯一的(唯一列),那么您应该有三个单独的 UniqueEntity 条目,每个条目都有一个字段:

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @UniqueEntity("email")
 * @UniqueEntity("anonymousGuid")
 * @UniqueEntity("qrcode")
 */