2017-01-20 14 views
0

タイトルとして、私はSQLクエリの正しいDQLバージョン(または対応するクエリビルダ)を取得するのに苦労しています。DQLのManyToManyと同等のSQLクエリJoinテーブルとの関係

が関係する表があります。 私はretriveする必要がSQL Graphic Schema

は、idで注文した各製品のために、そのイメージは「ORD」で注文しました。

これはSQLの正しいクエリです(うまくいけば.. btwは動作します:P)。

SELECT 
    PG.product_id, 
    PIJG.img_id, 
    PI.uri, 
    PI.ord 
FROM 
    ProductGeneral PG 
     JOIN 
    ProductImgJoinGeneral PIJG ON PG.product_id = PIJG.product_id 
     JOIN 
    ProductImg PI ON PIJG.img_id = PI.img_id 
ORDER BY 
    PG.product_id ASC, 
    PI.ord ASC; 

これらはエンティティ(うまくのみ関係)です:

class ProductGeneral { 
    //all the standard columns are omitted 

    /** 
    * @var \Doctrine\Common\Collections\Collection 
    * @ORM\ManyToMany(targetEntity="AppBundle\Entity\ProductImg", inversedBy="product") 
    * @ORM\JoinTable(name="productImgJoinGeneral", 
    * joinColumns={ 
    *  @ORM\JoinColumn(name="product_id", referencedColumnName="product_id") 
    * }, 
    * inverseJoinColumns={ 
    *  @ORM\JoinColumn(name="img_id", referencedColumnName="img_id") 
    * } 
    *) 
    */ 
    private $img; 
} 

class ProductImg { 
    //all the standard columns are omitted 

    /** 
    * @var \Doctrine\Common\Collections\Collection 
    * @ORM\ManyToMany(targetEntity="AppBundle\Entity\ProductGeneral", mappedBy="img") 
*/ 
    private $product; 
} 

すべてのヘルプは?

答えて

0

PIJGテーブルには、Doctrineマッピングでマッピングされたエンティティがありません。そのため、選択することはできません。しかしPIJG.img_id = PI.img_idは、あなたがこれを行うことができます。

$qb = $this->productGeneralRepository->createQueryBuilder('PG') 
    ->select('PG.product_id, PI.img_id, PI.uri, PI.ord') 
    ->innerJoin('PG.img', 'PI') 
    ->addOrderBy('PG.product_id', 'ASC') 
    ->addOrderBy('PI.ord', 'ASC'); 

を次にあなたが生のDQLをしたい場合は、単に$qb->getDql()を取得します。 innerJoinメソッドは、Doctrineマッピングのおかげでdouble JOINを自動的に実行します

+1

完了!私はとても近かった!私の一日を作ってくれてありがとう! – giacomoto