Symfony2 / Doctrine2 — Как преобразовать этот SQL-запрос с помощью QueryBuilder?

У меня есть отношение: Пользователь -> [OneToMany] -> Профиль ‹- [OneToMany] ‹- Группа

Когда пользователь присоединяется к группе, создается профиль с парой user_id/group_id.

И я хочу получить неприсоединенные группы от пользователя.

Этот SQL-запрос работает хорошо, но я хочу перевести его с помощью QueryBuilder:

Для пользователя с идентификатором 2,

SELECT g.id 
FROM Group g 
WHERE id NOT IN (SELECT group_id FROM Profile WHERE user_id = 2)

Спасибо за вашу помощь.


person Sly    schedule 22.02.2013    source источник


Ответы (1)


не проверял, но думаю должно работать

    $qb = $this->conn->createQueryBuilder();
    $qb->select('g.id');
    $qb->from('Group', 'g');
    $qb->innerJoin('g', 'Profile', 'p', 'g.id != p.group_id');
    $qb->where('p.group_id = 2);

** редактировать Извините, я не читал не присоединенную часть.

Попробуй это

$qb = $this->conn->createQueryBuilder();
$qb->select('g.id');
$qb->from('Group', 'g');
$qb->where($qb->expr()->notin(
       'g.id',
       $qb2->select('p.group_id')
           ->from('Profile', 'p')

           ->getDQL()
));
person c4pone    schedule 22.02.2013
comment
$qb->select('g') ->from('MyBundle:Group', 'g') ->innerJoin('g.profiles', 'p', 'g != p.group') ->where('p.user = 2') ->getQuery() ->getResult(); возвращает группы, к которым я присоединился от пользователя 2, мне нужны группы, к которым я не присоединился - person Sly; 22.02.2013
comment
Привет! Извините, я занимался другим делом. Я внес несколько изменений в свою БД, теперь у меня работает этот запрос запрос, но мне интересно, есть ли способ избежать шага между двумя запросами. Мой подзапрос возвращает мне массив массивов, но мне нужен массив идентификаторов... - person Sly; 26.02.2013