2

Symfony2でQueryBuilderを使用してこのクエリを実行するにはどうすればよいですか?

SELECT um.id, sv.patentgroup_id, pm.portfolio_id, pp.id
FROM sv_patents sv
LEFT JOIN pm_patentgroups pm ON sv.patentgroup_id = pm.id
LEFT JOIN pm_portfolios pp ON pm.portfolio_id = pp.id
LEFT JOIN um_users um ON pp.user_id

エンティティクラスの関連付けは、次のように定義されます。

SvPatentsで私は持っています

 /**
 * @var PmPatentgroups
 *
 * @ORM\ManyToOne(targetEntity="PmPatentgroups")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="patentgroup_id", referencedColumnName="id")
 * })
 */
private $patentgroup;

PmPatentgroupsで私は持っています

/**
 * @var PmPortfolios
 *
 * @ORM\ManyToOne(targetEntity="PmPortfolios")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="portfolio_id", referencedColumnName="id")
 * })
 */
private $portfolio_id;

PmPortfoliosで私は持っています

/**
 * @var UmUsers
 *
 * @ORM\ManyToOne(targetEntity="UmUsers")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 * })
 */
private $user;

これを試しましたが、テーブルの結果全体が結合が適切に機能していないように見えます

$repository = $this->getDoctrine()->getRepository('MunichInnovationGroupBundle:SvPatents');
        $qb = $repository->createQueryBuilder('sv')
        ->leftJoin('sv.patentgroup','pm')
        ->leftJoin('pm.portfolio_id','pp')
        ->leftJoin('pp.user','um')
        ->getQuery();
        $patents = $qb->getArrayResult();

私はSymfony2とDoctorine2にまったく慣れていません。ドキュメント全体を読みましたが、そのような複雑な例を見つけることができませんでした。実際、querybuilderがクエリを作成する方法に少し混乱しています。簡単な言葉で少し説明していただければ幸いです

前もって感謝します

4

2 に答える 2

2

私は自分の問題の解決策を見つけました。uがテーブル内の特定のユーザーのレコードを検索する場合は、where句を1つ追加する必要があります。クエリは次のようになります

$user_id = 1;
        $repository = $this->getDoctrine()->getRepository('MunichInnovationGroupBundle:SvPatents');
        $qb = $repository->createQueryBuilder('sv')
        ->select('sv')
        ->leftJoin('sv.patentgroup','pm')
        ->leftJoin('pm.portfolio_id','pp')
        ->leftJoin('pp.user','um')
        ->where('pp.user = :user_id')
        ->setParameter('user_id', $user_id)
        ->getQuery();
        $patents = $qb->getArrayResult();

それで全部です :)

于 2012-06-02T21:44:55.223 に答える
0

あなたはとても近いです。->select()クエリ部分を追加するだけです。

$repository = $this->getDoctrine()->getRepository('MunichInnovationGroupBundle:SvPatents');
$qb = $repository->createQueryBuilder('sv')
                 ->select('um.id, pm.id, pp.id') // add this part
                 ->leftJoin('sv.patentgroup','pm')
                 ->leftJoin('pm.portfolio_id','pp')
                 ->leftJoin('pp.user','um')
                 ->getQuery();
$patents = $qb->getArrayResult();
于 2012-06-02T21:18:34.613 に答える