2017-01-20 2 views
0

Как заголовок, я изо всех сил пытаюсь получить правильную версию DQL (или корреспондентский построитель запросов) SQL-запроса.Эквивалентный SQL-запрос в DQL с отношением ManyToMany с таблицей join

Есть таблицы, участвующие: SQL Graphic Schema

мне нужно retrive, для каждого заказанного продукта по идентификатору, его изображений по заказу «Орды».

Это правильный запрос в SQL (надеюсь, btw it works: 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 автоматически выполняет двойной JOIN благодаря картированию Doctrine

+1

PERFECT! Черт, я был так близок! Спасибо, что сделал мой день! – giacomoto

Смежные вопросы