我想通过在多个字段上使用UniqueEntity Validation Constraint来验证从表单提交的实体的唯一性。Symfony2 UniqueEntity多个字段:误报验证?
应该是唯一的实体的代码有两个领域 - 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_b'
现在,当我试图从一个表单提交另一个与值(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”关系,这会导致问题。
是否有可能以某种方式为我的问题使用此验证约束,或者我必须以另一种方式验证它?
谢谢你,它的工作!唯一的问题是,每个断言都需要另一个查询,但我想我可以忍受它。 – csabavegso
否则,你总是有解决方案来写你自己的验证器,灵感来自UniqueEntity Validator – webda2l