Symfony UniqueEntity vs UniqueConstraint vs unique=true

Posted

技术标签:

【中文标题】Symfony UniqueEntity vs UniqueConstraint vs unique=true【英文标题】: 【发布时间】:2017-09-25 22:29:01 【问题描述】:

谁能解释@UniqueEntity验证器、@UniqueConstraint表注释和@Column注释的unique=true选项之间的概念区别。

我了解@UniqueConstraint 在数据库级别添加UNIQUE 索引,@UniqueEntity 在 ORM 级别验证。那么我应该使用哪个选项,或者我应该使用所有选项?

【问题讨论】:

***.com/questions/33196548/… 【参考方案1】:

@UniqueConstraintunique=true 是 Doctrine 的一部分并且做类似的事情。

当您在特定列上设置unique=true 时,Doctrine 将在该列上创建一个唯一键在数据库中物理

@UniqueConstraint 可用于在多个列上创建唯一键在数据库中(复杂唯一键)。但是,如果您传递单个列,则结果将与在该字段上使用 unique=true 完全相同。

另一方面,@UniqueEntity 不是 Doctrine 的一部分,但 它是 Symfony 框架的一部分。虽然 Doctrine 使用上面的选项来生成正确的模式,但这只是 Symfony 表单组件在提交表单时通常使用的验证器。

所以要回答您的最后一个问题 - 是的,您通常应该同时使用 @UniqueEntity@UniqueConstraintunique=true 之一。

【讨论】:

【参考方案2】:

如documentation 中所述,@UniqueConstraint 注释用于在多个列上创建唯一约束,而unique=true 用于对一列进行唯一约束。

UniqueEntityValidator 的存在是为了显示友好的错误消息,唯一的数据库约束的目的是确保您不存储重复数据。

所以你的问题的答案是这样的——你应该同时使用数据库约束和@UniqueValidator

【讨论】:

以上是关于Symfony UniqueEntity vs UniqueConstraint vs unique=true的主要内容,如果未能解决你的问题,请参考以下文章

Symfony UniqueEntity 验证消息

如何在加密字段上使用 UniqueEntity 约束?

Symfony 验证器的注释返回“注释从未导入异常”

@UniqueEntity 自定义消息未翻译

唯一实体消息

FOSUserBundle:UniqueEntity 注释抛出:字段“用户”没有被 Doctrine 映射,因此无法验证其唯一性