首页 文章

QueryBuilder和具有ManyToMany关系的实体

提问于
浏览
0

在数据库中,我有一个表User(idUser,name ...)和一个表Role(IdRole,description ..) . 在他们两个之间有一个链接表HasRole(idUser,idRole) .

使用Symfony命令行生成实体时,不会生成HasRole实体 . 相反,在用户实体中我在角色属性上有这个:

* @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Role", inversedBy="utilisateur")
 * @ORM\JoinTable(name="hasrole",
 *   joinColumns={
 *     @ORM\JoinColumn(name="UTILISATEUR", referencedColumnName="ID")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="ROLE", referencedColumnName="ID")
 *   }
 * )

我想在UserRepository中创建一个方法,该方法返回一个id Role的所有用户 .

它应该像这样开始:

$qb = $this->getEntityManager()->createQueryBuilder()
        ->select('utilisateur')
        ->from('ACCUEILBundle:User', 'utilisateur');

你可以帮忙吗?

2 回答

  • 1

    如果您使用Doctrine生成ManyToMany连接表,那么实际上您将没有实体 .

    如果您将连接表作为实体(例如,因为您在该表中存储了其他数据),那么您应该按以下方式创建关系:

    entityA <-OneToMany-> joinEntity <-ManyToOne-> entityB
    

    但是在您的情况下,只需获取具有所需ID的角色,然后从中获取用户就足够了:

    $role = $entityManager->getRepository('Role')->find($id);
    $users = $role->getUsers(); //(or getUtilisatuers(), if I see correctly)
    
  • 0

    我给你一个例子,以便你可以将它用于你的案例中 . 我删除了大部分实体属性/注释,以便您轻松获取图片 .

    在下面的示例中,存在学生(M)到(N)主题关系 . 要实现M-N,您可以将学生(1)到(N)学生主体(N)到(1)主题,因此关系保存在StudentSubject实体中 .

    Student

    class Student
    {
        protected $id;
    
        /**
         * @ORM\OneToMany(targetEntity="StudentSubject", mappedBy="studentMap", cascade={"persist", "remove"})
         */
        protected $studentInverse;
    }
    

    Subject

    class Subject
    {
        protected $id;
    
        /**
         * @ORM\OneToMany(targetEntity="StudentSubject", mappedBy="subjectMap", cascade={"persist", "remove"})
         */
        protected $subjectInverse;
    }
    

    StudentSubject

    /**
     * @ORM\Entity(repositoryClass="School\FrontendBundle\Repository\StudentSubjectRepository")
     */
    class StudentSubject
    {
        protected $id;
    
        /**
         * @ORM\ManyToOne(targetEntity="Student", inversedBy="studentInverse")
         * @ORM\JoinColumn(name="student", referencedColumnName="id", nullable=false, onDelete="CASCADE")
         */
        protected $studentMap;
    
        /**
         * @ORM\ManyToOne(targetEntity="Subject", inversedBy="subjectInverse")
         * @ORM\JoinColumn(name="subject", referencedColumnName="id", nullable=false, onDelete="CASCADE")
         */
        protected $subjectMap;
    }
    

    Example Query:

    此查询仅选择Student和Subject实体中的给定字段 .

    class StudentSubjectRepository extends EntityRepository
    {
        public function findAll()
        {
            $fields = [
                'st.id AS stId',
                'st.studentId AS stStId',
                'sb.id AS sbId',
                'sb.code AS sbCode',
            ];
    
            return
                $this
                    ->createQueryBuilder('ss')
                    ->select($fields)
                    ->join('ss.studentMap', 'st')
                    ->join('ss.subjectMap', 'sb')
                    ->addOrderBy('st.studentId', 'ASC')
                    ->addOrderBy('sb.code', 'ASC')
                    ->getQuery()
                    ->getResult(Query::HYDRATE_SCALAR);
        }
    }
    

相关问题