2017-01-10 3 views
2

У меня есть следующая ситуация. Мне нужно сделать запрос, и я не знаю, как вложить подзапросы в DQL.Запрос с подзапросом по Symfony на DQL

У меня есть таблица пользователей. Внутри этого стола есть продавцы и представители. Пользователи имеют:

---- ID, 
---- Name 
---- Profile (ROLE_REPRESENTATIVE, ROLE_SELLER) 
---- Status (1 = DECLINE | 2 = ON_HOLD | 3 = APPROVED) 

Пример: Users Таблица

--------- ID ----------- Name ------------------ PROFILE ------------ STATUS ---- REPRESENTATIVE_ID ---- 
    ------ 1 -------- Representative_1 ------ ROLE_REPRESENTATIVE ------ 3 ----------- NULL ------------- 
    ------ 2 -------- seller_1 -------------- ROLE_SELLER -------------- 3 ------------ 1 --------------- 
    ------ 3 -------- seller_2 -------------- ROLE_SELLER -------------- 3 ------------ 1 --------------- 
    ------ 4 -------- seller_3 -------------- ROLE_SELLER -------------- 2 ------------ 1 --------------- 
    ------ 5 -------- Representative_2 ------ ROLE_REPRESENTATIVE ------ 3 ----------- NULL ------------- 
    ------ 6 -------- Representative_3 ------ ROLE_REPRESENTATIVE ------ 3 ----------- NULL ------------- 
    ------ 7 -------- seller_4 -------------- ROLE_SELLER -------------- 2 ------------ 5 --------------- 
    ------ 8 -------- seller_5 -------------- ROLE_SELLER -------------- 2 ------------ 5 --------------- 
    ------ 9 -------- seller_6 -------------- ROLE_SELLER -------------- 2 ------------ 5 --------------- 
    ----- 10 -------- seller_7 -------------- ROLE_SELLER -------------- 3 ------------ 1 --------------- 
    ----- 11 -------- seller_8 -------------- ROLE_SELLER -------------- 3 ------------ 1 --------------- 

Продавцы имеют представителей (представителей), который представляет собой 1-Н связь между пользователями и пользователями.

Тогда, мне нужно, чтобы получить все представители (ID + имя) и общее количество продавцов, которые не были одобрены (статус = 2) (статус = 2 = ON_HOLD)

Получить Представители

SELECT representatives 
FROM AppBundle: User representatives 
WHERE 
    Representatives.profile = 'ROLE_REPRESENTATIVE' 
GROUP BY representatives.id 
ORDER BY representatives.id DESC 

Получить продавцов "в ожидании", чтобы утвердить

SELECT sellers 
FROM AppBundle: User sellers 
WHERE 
    Sellers.profile = 'ROLE_SELLER' AND 
    Sellers.status = 2 
GROUP BY sellers.id 
ORDER BY sellers.id DESC 

Final Я должен знать, как это сделать:

----- ID ----------- Name --------------- TotalSellersOnHold ----- 
------ 1 -------- Representative_1 ------------- 40 ----------------- 
------ 5 -------- Representative_2 ------------- 27 ----------------- 
------ 6 -------- Representative_3 ------------- 12 ----------------- 

Как этот запрос может быть выполнен в одном запросе?

ответ

1

Команда SQL должна быть что-то вроде этого:

SELECT r.ID, r.Name, COUNT(DISTINCT s.id) as 'TotalSellerOnHold' FROM users r 
INNER JOIN users s ON s.REPRESENTATIVE_ID = r.id 
WHERE r.TYPE = 'ROLE_REPRESENTATIVE' 
AND s.STATUS = 2 
AND s.TYPE = 'ROLE_SELLER' 
GROUP BY r.ID 
ORDER BY r.ID DESC; 

В DQL (предполагается, что вы в пользовательский репозиторий)

//AppBundle/Repository/MyRepository.php 
public function getAllRepresentativesWithOnSellers() 
{ 
    $query = $this->createQueryBuilder('r') 
     ->select('r.id, r.name') 
     ->addSelect('COUNT(DISTINCT s.id)') 
     ->innerJoin('AppBundle\Entity\User', 's') 
     ->where('r.type = ROLE_REPRESENTATIVE') 
     ->andWhere('s.status = 2') 
     ->andWhere('s.type = ROLE_SELLER') 
     ->groupBy('r.id') 
     ->orderBy('r.id', 'desc') 
     ->getQuery() 
    ; 

    return $query->getResult(); 
} 
+0

совершенна. Благодаря!!! – Javier

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

  • Нет связанных вопросов^_^