我正在尝试通过在多个字段上使用UniqueEntity Validation Constraint来验证从表单提交的实体的唯一性。
应该是唯一的实体代码有两个字段 - fieldA 和 fieldB ,两者都是唯一的:
/**
* @ORM\Table(name="mytable")
* @ORM\Entity
* @DoctrineAssert\UniqueEntity(fields = {"fieldA", "fieldB"})
*/
class myClass
{
/**
* @ORM\Column(name="fieldA", type="string", length=128, unique=true)
*/
protected $fieldA;
/**
* @ORM\Column(name="fieldB", type="string", length=128, unique=true)
*/
protected $fieldB;
}
假设我在数据库中已经有一个值为
的记录现在,当我尝试从表单中提交另一个值(fieldA ='value_a',fieldB ='value_c')时,Symfony2会生成一个查询以检查唯一性:
SELECT ... FROM ... WHERE fieldA = ? AND fieldB = ? ('value_a', 'value_c')
验证通过,因为结果是空集,但是我希望它失败,因为在这种情况下fieldA不是唯一的。 (SQL插入失败,并在'value_a'上出现重复的条目错误。)
Symfony2's UniqueEntity documentation says:
此必填选项是此实体应该唯一的字段(或字段列表)。例如,您可以指定上述用户示例中的电子邮件和名称字段都应该是唯一的。
我认为这证实了我的期望。
我发现in the source of UniqueEntityValidator (line 94),验证器将字段作为数组,并使用“findBy”魔术查找方法来检查唯一性。此方法使用查询中的参数之间的“AND”关系,这会导致问题。
是否有可能以某种方式对我的问题使用此验证约束,或者我必须以另一种方式验证它?
答案 0 :(得分:15)
应该是:
/**
* @ORM\Table(name="mytable")
* @ORM\Entity
* @DoctrineAssert\UniqueEntity(fields = "fieldA")
* @DoctrineAssert\UniqueEntity(fields = "fieldB")
*/
class myClass
通过
* @DoctrineAssert\UniqueEntity(fields = {"fieldA", "fieldB"})
它将检查两个字段是否都没有相同的行。
假设您已经在数据库中有一条记录值:
fieldA = 'value_a', fieldB = 'value_b'
现在,当您尝试从表单提交另一个值(fieldA ='value_a',fieldB ='value_c')时,Symfony2会生成一个查询以检查唯一性:
SELECT ... FROM ... WHERE fieldA =? AND fieldB =? ('value_a','value_c')
这将通过,因为它与
的行不匹配fieldA = 'value_a', fieldB = 'value_b'
只有当您从表单提交另一个值(fieldA ='value_a',fieldB ='value_b')时,验证才会通过。
这是它应该工作的方式以及如何在文档中解释它: http://symfony.com/doc/current/reference/constraints/UniqueEntity.html#fields
答案 1 :(得分:10)
怎么样:
/**
* @ORM\Table(name="mytable")
* @ORM\Entity
* @DoctrineAssert\UniqueEntity(fields = "fieldA")
* @DoctrineAssert\UniqueEntity(fields = "fieldB")
*/
class myClass