对于使用Doctrine ORM的Symfony中的不同实体,id永远不会重复

时间:2013-11-10 20:03:33

标签: symfony doctrine-orm

我正在为symfony2应用程序开发自定义用户包,该应用程序有3种类型的用户:管理员,教授和学生。每种类型的用户都有一个标识符(国家标识号,西班牙语: dni )和另一个数据,如name,lastName等(不同用户类型之间的数据是不相交的)

我的问题是,无论用户的类型如何,我都不需要重复 dni

我使用了UniqueEntity注释,但这只适用于相同类型的实体。

我如何为不同类型的实体做到这一点?

我曾经想过使用回调注释并检查一个查询,在其他实体中没有具有该dni的实体,但为此我必须在实体内部使用实体管理器,这是一种不好的做法。 / p>

还有另一种方法吗?

问候和感谢。

3 个答案:

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

}