0

我正在使用 Symfony2。
我有两个班级:employeephysiciandoctor是 的子类employee

实体employee

@UniqueEntity(fields={"email"}, message="Este valor ya se ha utilizado.")

当我唯一实体时,有效的电子邮件字段仅针对员工和医生分别进行验证。

如果我插入employee3mail1@mail.com错误断言symfony2 工作正常
如果我插入医生2mail3@mail.com错误断言symfony2 工作正常
如果我插入医生2mail1@mail.com显示错误sql 但没有错误断言symfony2。

4

1 回答 1

0

这是UniqueEntityValidator课程的一部分:

$repository = $em->getRepository($className);
$result = $repository->{$constraint->repositoryMethod}($criteria);

/* If the result is a MongoCursor, it must be advanced to the first
 * element. Rewinding should have no ill effect if $result is another
 * iterator implementation.
 */
if ($result instanceof \Iterator) {
    $result->rewind();
}

/* If no entity matched the query criteria or a single entity matched,
 * which is the same as the entity being validated, the criteria is
 * unique.
 */
if (0 === count($result) || (1 === count($result) && $entity === 
    ($result instanceof \Iterator ? $result->current() : current($result)))) {
    return;
}

如您所见,$em->getRepository($className)将用作存储库。问题是,如果没有repositoryMethod选项,Symfony 将使用findByDoctrine 的方法,在每个存储库中都可用,甚至是继承自EntityRepository.

当您的实体是 时,Symfony 将仅在员工中Employee寻找具有给定字段的现有实体:

$em->getRepository('AcmeHelloBundle:Employee')->findBy($criteria);

当实体是Physician仅在医生中查看)时也会发生同样的情况:

$em->getRepository('AcmeHelloBundle:Physician')->findBy($criteria);

引用你的话:

如果我插入 employee3 mail1@mail.com 错误断言 symfony2 工作正常

那是因为没有电子邮件为 mail1@mail.com 的员工

如果我插入医生2 mail3@mail.com 错误断言 symfony2 工作正常

出于与上述相同的原因。

如果我插入医生2 mail1@mail.com 显示错误 sql 但没有错误断言 symfony2

这就是问题所在!没有mail1@mail.com 邮箱的医生!有一位员工使用相同的电子邮件,但在findBy针对医生存储库使用时,它返回0.

也许您应该将选项设置为将查找使用数组作为条件进行搜索repositoryMethod的存储库方法。employeephysician

于 2013-02-28T11:37:39.420 回答