我正在使用Symfony2
我有两个班级:employee
和physician
。 doctor
是employee
的子类。
实体employee
:
@UniqueEntity(fields={"email"}, message="Este valor ya se ha utilizado.")
当我的独特实体有效电子邮件字段仅针对员工和医生单独验证时。
如果我插入employee3 mail1@mail.com
错误断言symfony2工作正常
如果我插入doctor2 mail3@mail.com
错误断言symfony2工作正常
如果我插入doctor2 mail1@mail.com
显示错误sql但没有错误断言symfony2。
答案 0 :(得分: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将使用Doctrine的findBy
方法,该方法可在每个存储库中使用,甚至可以使用从EntityRepository
继承的自定义方法。
当您的实体为Employee
时,Symfony将仅在员工中寻找具有给定字段的现有实体:
$em->getRepository('AcmeHelloBundle:Employee')->findBy($criteria);
当实体为Physician
时,同样的情况也会发生(只在医生中看):
$em->getRepository('AcmeHelloBundle:Physician')->findBy($criteria);
引述你:
如果我插入employee3 mail1@mail.com错误断言symfony2工作正常
那是因为没有员工使用电子邮件mail1@mail.com
如果我插入doctor2 mail3@mail.com错误断言symfony2工作正常
出于与上述相同的原因。
如果我插入doctor2 mail1@mail.com显示错误sql但没有错误断言 Symfony2的
这是问题所在!没有医生用mail1@mail.com发送电子邮件!有一位员工使用相同的电子邮件,但在对医生存储库使用findBy
时,会返回0
。
也许您应该将repositoryMethod
选项设置为存储库方法,在使用数组作为条件进行搜索时会查找employee
或physician
。