Querybuilder Inner Join在doctrine2中返回太多

时间:2013-02-12 08:05:40

标签: php symfony doctrine doctrine-orm

这是我在Symfony2-Project中使用doctrine:

的查询
    $qb->select(array('r', 'fp', 'p'))
    ->from('Farmerguide\BackendBundle\Entity\Farmerproduct', 'fp')
    ->innerJoin('fp.product', 'p')
    ->innerJoin('p.rubric', 'r')
    ->andWhere('fp.farmer= :id')
    ->setParameter('id', $farmerId);

有关表格/实体的信息: Farmerproduct有一个id,farmer_id和product_id 产品有一个id,和rubric_id(产品是某种“子目录”的量规)

对于一个农民,我现在想要所有的东西,没有别的东西。 但是当我更改select - 部分时,我收到错误,它表示需要选择所有joined个实体...

好吧,现在我得到所有加入的信息,所以对于1位农民的100种产品,我得到的每一种产品都带有量规和农民(我不知道为什么我要找农民......)

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您必须选择DQL查询的根实体。假设您没有双向关联,它看起来如下:

SELECT
    r
FROM
    Farmerguide\BackendBunle\Entity\Rubric r
WHERE
    r.id IN (
        SELECT
            r2.id
        FROM
            Farmerguide\BackendBundle\Entity\Farmerproduct fp
        JOIN
            fp.product p
        JOIN
            p.rubric r2
        WHERE
            fp.farmer = :id
    )

QueryBuilder API中,如下所示:

$qb1 = $em->createQueryBuilder();
$qb2 = $em->createQueryBuilder();

$qb2
    ->select(array('r2.id'))
    ->from('Farmerguide\BackendBundle\Entity\Farmerproduct', 'fp')
    ->innerJoin('fp.product', 'p')
    ->innerJoin('p.rubric', 'r2')
    ->andWhere('fp.farmer= :id')

$qb1
    ->select('r')
    ->from('Farmerguide\BackendBunle\Entity\Rubric', 'r')
    ->where($qb->expr()->in('r.id', $qb2->getDQL()))

$rubrics = $qb1
    ->setParameter('id', $farmerId)
    ->getQuery()
    ->getResult();

如果你真的不需要QueryBuilder,请考虑使用普通DQL:正如你所看到的那样简单。