这是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 将使用findBy
Doctrine 的方法,在每个存储库中都可用,甚至是继承自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
的存储库方法。employee
physician