Symfony2 UniqueEntity多个字段:误报验证?

时间:2011-12-13 15:23:36

标签: validation orm symfony doctrine-orm

我正在尝试通过在多个字段上使用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_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”关系,这会导致问题。

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

2 个答案:

答案 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