我正在为symfony2应用程序开发自定义用户包,该应用程序有3种类型的用户:管理员,教授和学生。每种类型的用户都有一个标识符(国家标识号,西班牙语: dni )和另一个数据,如name,lastName等(不同用户类型之间的数据是不相交的)
我的问题是,无论用户的类型如何,我都不需要重复 dni 。
我使用了UniqueEntity注释,但这只适用于相同类型的实体。
我如何为不同类型的实体做到这一点?
我曾经想过使用回调注释并检查一个查询,在其他实体中没有具有该dni的实体,但为此我必须在实体内部使用实体管理器,这是一种不好的做法。 / p>
还有另一种方法吗?
问候和感谢。
答案 0 :(得分:1)
解决。这是最后的片段(感谢ladislav_prague)
$repository_a = $this->getDoctrine()->getRepository('AppBundle:Administrator');
$administrator_dni_used = $repository_a->createQueryBuilder('a')->where('a.dni = \'' . $dni_to_check . '\'')->getQuery()->getOneOrNullResult();
$repository_p = $this->getDoctrine()->getRepository('AppBundle:Professor');
$professor_dni_used = $repository_a->createQueryBuilder('p')->where('p.dni = \'' . $dni_to_check . '\'')->getQuery()->getOneOrNullResult();
$repository_s = $this->getDoctrine()->getRepository('AppBundle:Student');
$student_dni_used = $repository_a->createQueryBuilder('s')->where('s.dni = \'' . $dni_to_check . '\'')->getQuery()->getOneOrNullResult();
if(is_null($administrator_dni_used) and is_null($professor_dni_used) and is_null($student_dni_used)){
// add new user
}else{
$error = new FormError("There is already an user with that dni");
$editForm->get('dni')->addError($error);
// ...
}
答案 1 :(得分:0)
只需创建一个新实体(我们称之为Dni),它将所有表中的dni值作为AdministratorDni,ProfessorDni和StudentDni属性从OneToOne与每个已存在的实体相关联。
然后,每次添加新管理员/教授/学生之前,请创建一个学说查询,以从AdministratorDni,ProfessorDni和StudentDni中选择最大值。您将获得三个最新的dni最大值,因此只需使用max()函数来获得实际的最高dni。
答案 2 :(得分:0)
如果插入的最后一个用户的dni小于第一个用户,则在创建新用户之前检查现有的dni。像这样:
$repository_a = $this->getDoctrine()->getRepository('AppBundle:Administrator');
$administrator_dni_used = $repository_a->createQueryBuilder('a')->where('a.dni = \'' . $dni_to_check . '\'')->getQuery()->getOneOrNullResult();
$repository_p = $this->getDoctrine()->getRepository('AppBundle:Professor');
$professor_dni_used = $repository_a->createQueryBuilder('p')->where('p.dni = \'' . $dni_to_check . '\'')->getQuery()->getOneOrNullResult();
$repository_s = $this->getDoctrine()->getRepository('AppBundle:Student');
$student_dni_used = $repository_a->createQueryBuilder('s')->where('s.dni = \'' . $dni_to_check . '\'')->getQuery()->getOneOrNullResult();
if(is_null($administrator_dni_used) and is_null($professor_dni_used) and is_null($student_dni_used)){
// add new user
}