2011-12-13 82 views
5

我想通过在多个字段上使用UniqueEntity Validation Constraint来验证从表单提交的实体的唯一性。Symfony2 UniqueEntity多个字段:误报验证?

应该是唯一的实体的代码有两个领域 - FIELDAfieldB,既独特:

/** 
* @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”关系,这会导致问题。

是否有可能以某种方式为我的问题使用此验证约束,或者我必须以另一种方式验证它?

回答

8

什么:

/** 
* @ORM\Table(name="mytable") 
* @ORM\Entity 
* @DoctrineAssert\UniqueEntity(fields = "fieldA") 
* @DoctrineAssert\UniqueEntity(fields = "fieldB") 
*/ 
class myClass 

+0

谢谢你,它的工作!唯一的问题是,每个断言都需要另一个查询,但我想我可以忍受它。 – csabavegso

+1

否则,你总是有解决方案来写你自己的验证器,灵感来自UniqueEntity Validator – webda2l

13

它应该是:

/** 
* @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