Symfony2唯一约束和唯一性(完整性冲突)

Symfony2唯一约束和唯一性(完整性冲突),symfony,doctrine,entity,unique,unique-constraint,Symfony,Doctrine,Entity,Unique,Unique Constraint,几天来我对一个条令实体有点问题。我在两个字段上定义了一个UniqueConstraint,之后在这两个字段上进行了uniquentity验证。但是,在通过添加已在基中的实体来验证表单之后,无法在表单中获取错误消息 只是来自Symfony的一条错误消息: SQLSTATE[23000]:完整性约束冲突:1062键“SIRET”的重复条目“339057986-00012” 这是我的实体声明,对我来说一切都很好,但也许我忘记或误解了什么 为什么不把unique=true? 就像这样: /** *@va

几天来我对一个条令实体有点问题。我在两个字段上定义了一个UniqueConstraint,之后在这两个字段上进行了uniquentity验证。但是,在通过添加已在基中的实体来验证表单之后,无法在表单中获取错误消息

只是来自Symfony的一条错误消息:

SQLSTATE[23000]:完整性约束冲突:1062键“SIRET”的重复条目“339057986-00012”

这是我的实体声明,对我来说一切都很好,但也许我忘记或误解了什么


为什么不把
unique=true

就像这样:

/**
*@var string$SIREN
*
*@ORM\Column(name=“SIREN”,type=“string”,length=9,unique=true)
*/
私人警笛;
/**
*@var字符串$NIC
*
*@ORM\Column(name=“NIC”,type=“string”,length=5,unique=true)
*/
私人$NIC;
并添加“unique=true”不允许正确捕获错误。我也有同样的问题。如果我找到原因,我会回来告诉你的。也许它会帮助某人

编辑:(现在是答案)。 我看到很多帖子,但我没有找到任何好的解决办法。 这似乎是一个错误:

所以我使用了相同的解决方案:尝试/抓住。我只需要假设数据库引发的唯一异常是唯一的约束冲突

// ...
try {
 $this->persistAndFlush($user);

 return $this->redirect($this->generateUrl('publish'));
}
catch (\PDOException $e) {
 $error = $this->trans('user.username.notUnique',array(),'validators');
}
// ...
虽然不令人满意,但它确实有效。今天我浪费了足够多的时间


回答vegemite4me:对不起,我不熟悉Stackoverflow。我没有找到“评论”按钮,现在,我能看到的唯一一个按钮是回答你的。但它不起作用。。。要么我运气不好,要么我是个笨蛋,要么我的表格做得很差。可能是三个

在这里回复为时已晚,但仍在回复,以便帮助其他陷入同样问题的人

两件事
  • 除非要从实体生成架构更改查询,否则不需要
  • 这就是你需要的

简短回答 问题中的实体定义看起来不错,我认为可能存在以下两个问题之一

  • 您已经添加了
    字段={“SIREN”,“NIC”}
    ,这意味着它们在一起是唯一的,但您可能希望它们单独是唯一的
  • 或者您可能没有验证实体,我认为这是不太可能的,但我仍然希望被检查
    https://symfony.com/doc/current/validation.html#using-验证程序服务
详细解释如下 注意,我从
@ORM/Table
注释中去掉了
,uniqueConstraints={@ORM\UniqueConstraint(name=“SIRET”,columns={“SIREN”,“NIC”})}
(因为除非您想从实体中生成模式定义,否则不需要UniqueConstraint)


也许我不明白这个问题,但是,你想得到什么?表单中直接出现验证错误?是的,消息在我的Uniquentity验证规则中定义。因为这只会使每个字段/列唯一,而不是它们的组合。请将此作为注释添加。这是有用的信息,但不是答案。我不清楚为什么Symfony约束比ORM约束好。使用
“不需要UniqueConstraint,除非您想从实体中生成模式定义”
,这是什么意思;请你解释清楚好吗在表上指定
uniqueConstraints
,将允许具有一致的数据库;使用Symfony约束时,组合唯一性的验证取决于Symfony框架(可以绕过)。您的解决方案可行,但我不确定删除
UniqueConstraint
是正确的方法,因为它提供了一个不太严格的DB。