6

我对 Doctrine 2 有疑问,并且在我试图开始工作的 Maytomany 关系上左加入。这可能是我的查询生成器,但我似乎无法弄清楚。

我有一个像这样的连接表:

----------------------------------
| user_id    |   attraction_id   |
----------------------------------
| 4              1               |
| 4              2               |
| 4              3               |
----------------------------------

对于两个模型,用户和吸引力,其中用户是关系的所有者。

当我执行此查询时:

$attractions = $CI->em->createQueryBuilder()
        ->select('a', 'u')
        ->from('\ListLovers\Model\Attraction', 'a')
        ->leftJoin('a.users', 'u', \Doctrine\ORM\Query\Expr\Join::WITH, 'u.id = 4')
->getQuery()->getResult();

我的用户对 id 为 1 的景点的计数为 1。太棒了!

现在,如果我像这样在连接表中添加另一行:

----------------------------------
| user_id    |   attraction_id   |
----------------------------------
| 1              1               |
| 4              1               |
| 4              2               |
| 4              3               |
----------------------------------

...并执行相同的查询,我的用户对 id 为 1 的吸引力的计数是 ...零。什么?

我错过了什么吗?

谢谢,马克。

4

2 回答 2

6

多对多的最佳方式是MEMBER OFor NOT MEMBER OF

$attractions = $CI->em->createQueryBuilder()
        ->select('a', 'u')
        ->from('\ListLovers\Model\Attraction', 'a')
        ->where(':uid MEMBER OF a.users')
        ->setParameter('uid', 4)
        ->getQuery()->getResult();
于 2015-06-09T15:14:18.047 回答
0

如果您以这种方式尝试会怎样:

        $attractions = $CI->em->createQueryBuilder()
                        ->from('\ListLovers\Model\Attraction', 'a')
                        ->addSelect('a')
                        ->leftJoin('a.users', 'u')
                        ->addSelect('u')
                        ->where('u.id = :uid')
                        ->setParameter('uid', 4)
                    ->getQuery()
                    ->getResult();
于 2014-03-21T13:50:46.593 回答