Symfony 4 элемента запроса из объединенной таблицы, если они существуют - PullRequest
1 голос
/ 27 мая 2020

У меня есть две таблицы подарков и gift_tags, как мне выбрать все подарки с тегами, которых нет в массиве $avoidTags, только если у подарка есть теги. Мой запрос теперь работает, он выбирает только подарки, которые имеют хотя бы один тег в таблице gift_tags, и его нет в массиве $avoidTags, но мне нужны также те, у которых нет тегов вообще.

$response = $qb
            ->select('g, tags')
            ->leftJoin('g.tags', 'tags')
            ->andwhere($qb->expr()->notin("tags.name", ":avoidTags"))
            ->setParameters(new ArrayCollection([
                new Parameter('avoidTags', $avoidTags),
            ]))
            ->getQuery()
            ->getResult();

1 Ответ

1 голос
/ 27 мая 2020

С mysql он может делать с этим запросом

SELECT 
  gift.*, tag.* 
FROM 
  gift 
LEFT JOIN tag ON gift.id = tag.gift_id
  WHERE gift.id NOT IN (
    SELECT g.id FROM gift AS g LEFT JOIN tag AS t ON g.id = t.gift_id WHERE t.name IN ('test', 'test2')
  )

Так что с doctrine QB это может быть что-то вроде этого

 $subQb = $this->_em->createQueryBuilder()
            ->select('gift.id')
            ->leftJoin('gift.tags', 'tags')
            ->where($qb->expr()->orX(
                $qb->expr()->in("tags.name", ":avoidTags")),
            ))
            ->getQuery();

$response = $qb
        ->select('g, tags')
        ->leftJoin('g.tags', 't')
        ->where($qb->expr()->notin("g.id", $subQb->getDql())))
        ->setParameters(new ArrayCollection([
            new Parameter('avoidTags', $avoidTags),
        ]))
        ->getQuery()
        ->getResult();
...