【问题标题】:QueryBuilder and entity with ManyToMany relationQueryBuilder 和具有多对多关系的实体
【发布时间】:2016-08-08 13:21:02
【问题描述】:

在数据库中,我有一个表 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');

你能帮忙吗?

【问题讨论】:

    标签: symfony doctrine query-builder


    【解决方案1】:

    如果你使用 Doctrine 来生成你的 ManyToMany 连接表,那么你确实不会有一个实体。

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

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

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

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

    【讨论】:

      【解决方案2】:

      我给你一个例子,这样你就可以把它应用到你的案例中。我已经删除了大部分实体属性/注释,以便您轻松获取图片。

      在下面的示例中,存在 Student (M) 与 (N) Subject 的关系。要实现 M-N,您可以 Student (1) to (N) StudentSubject (N) to (1) Subject,这样关系就保存在 StudentSubject 实体中。

      学生

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

      主题

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

      学生科目

      /**
       * @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;
      }
      

      示例查询:

      此查询仅从 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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        • 2020-01-26
        • 2019-04-24
        相关资源
        最近更新 更多