2

これは、教義を使用したSymfony2-Projectでの私のクエリです。

    $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 productにはidがあり、rubric_id(productはrubricの「サブディレクトリ」のようなものです)

私は今、一人の農民のために、他に何もなしですべてのルーブリックが欲しいです。しかし、select-partを変更するとエラーが発生し、すべてのjoinedエンティティを選択する必要があると表示されます...

さて、今はすべての参加情報を取得しているので、1人の農家の100個の製品について、すべての製品をルーブリックと農家で取得しています(なぜ農家も取得するのかわかりません)。

助言がありますか?

4

1 に答える 1

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
    )

APIではQueryBuilder、これは次のようになります。

$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の使用を検討してください。ご覧のとおり、より簡単です。

于 2013-02-12T10:49:31.087 に答える