【问题标题】:Inner join on many to many relation多对多关系的内连接
【发布时间】:2019-02-12 00:43:10
【问题描述】:

我的 symfony 项目中有这两个实体:房屋和软件。

很多Home可以有很多软件,很多软件可以属于很多home

我试图只获得具有 的 Homes,比如说 1 号软件 + 2 号软件。

实际上,我已经设法检索到具有软件 n°1 和具有软件 n°2 的 家庭,但不能同时检索具有软 1 + 软 2 的家庭

如果我没记错的话,应该是Inner join吧?

这是我的实体和存储库的方法:

    class Software {
          /**
           * @ORM\ManyToMany(targetEntity="App\Entity\Home", mappedBy="softwares")
           */
           private $homes;

           public function __constuct() {
               $this->homes = new ArrayCollection();
           }

           // ...

           public function getHomes(){ ... }
           public function addHome(Home $home){ ... }
           // ...

    }


    class Home {
          /**
           * @ORM\ManyToMany(targetEntity="App\Entity\Software", inversedBy="homes")
           */
           private $softwares;

           public function __constuct() {
               $this->softwares = new ArrayCollection();
           }

           //...

           public function getSoftwares(){ ... }
           public function addSoftware(Software $software){ ... }
           //...

    }

主存储库

    class HomeRepository extends ServiceEntityRepository {
          public function innerJoinSoftware($softIds)
          {
               $qb = $this->createQueryBuilder('c')
                   ->innerJoin('c.softwares', 's')
                   ->andWhere('s.id IN(:softIds)')
                     ->setParameter('softIds', $softIds)
              ;
              return $qb->getQuery()->getResult();
         }
    }

为了说明我的观点:

  • Home1 有 soft1、soft2

  • Home2 有 soft1、soft3

  • Home3有soft2,soft3

我想做的是像

  dump(homeRepo->innerJoinSoftware([1, 2]));
  //should output Home1 but actually I have
  //it outputs Home1, Home2, Home3

这是我提出的 SQL 版本,但我仍然无法使用 Doctrine 完成此操作

  SELECT home.id, home.name FROM Home as home
  INNER JOIN (
        SELECT home_id as home_id, COUNT(home_id) as count_home
        FROM home_software
        WHERE software_id IN (1, 2)
        GROUP BY home_id
        HAVING count_home = 2) as soft # count_home should be dynamic 
  ON home.id = soft.home_id
  ORDER BY home.name

【问题讨论】:

  • 看看this answer
  • 我查看了您提供的链接!这真的很有趣!我发现了很多!但这并没有解决我的问题:我不想检索软件,而是检索其软件在传入参数列表中的房屋

标签: inner-join symfony4 doctrine-query


【解决方案1】:

以下是我解决此问题的方法(借助我发布的原始 SQL)

public function findBySoftwaresIn($softIds)
{
    //retrieve nbr of soft per home
    $nbrSoftToFind = count($softIds);
    $qb = $this->createQueryBuilder('h');

    $qb->innerJoin('h.softwares', 's')
        ->andWhere('h.id IN (:softIds)')
            ->setParameter('softIds', $softIds)

        //looking for home coming back by nbrSoft
        ->andHaving($qb->expr()->eq($qb->expr()->count('h.id'), $nbrSoftToFind))
        ->groupBy('h.id')//dont forget to group by ID
        ->addOrderBy('h.name')
    ;

    return $qb->getQuery()->getResult();
}

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 2023-03-04
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2019-08-22
    • 2016-02-18
    相关资源
    最近更新 更多