Конвертировать SQL с подзапросом в Doctrine Query Builder - PullRequest
0 голосов
/ 04 июня 2018

Я придерживаюсь структуры базы данных:


List item

trips (ManyToMany to tags over table trips_tags)
+----+----------------+
| id |      name      |
+----+----------------+
|  1 | Czech Republic |
|  2 | Germany        |
|  3 | Poland         |
+----+----------------+

tags
+----+-----------+
| id |   name    |
+----+-----------+
|  1 | Mountains |
|  2 | Beach     |
|  3 | City      |
+----+-----------+

trips_tags
+----------+---------+
| trips_id | tags_id |
+----------+---------+
|        1 |       1 |
|        1 |       2 |
|        3 |       1 |
+----------+---------+

Мне нужно выбрать поездки, в которых есть все указанные мной теги.

  • Нужны поездки для тегов Горы, так как на пляже я получаю только чешскийРеспублика.
  • Нужны поездки только для тега Горы, получить Чехию и Польшу

Я написал простой SQL

SELECT trip.name, trip.id
FROM trips AS trip
WHERE (
    SELECT COUNT(trip_tag.tags_id) 
    FROM trips_tags AS trip_tag 
    WHERE trip_tag.tags_id IN (1, 2) 
      AND trip_tag.trips_id = trip.id
) = numberOfTags`

Теперь У меня естьПроблема написать этот SQL в DQL .Кто-нибудь может помочь?

Спасибо

1 Ответ

0 голосов
/ 04 июня 2018

Похоже, у вас есть много-много взаимосвязей между поездками и тегами. Лучше придерживаться доктрины, определять свои энты и соотносить их столько же со многими, как

class Trip
{
    // ...

    /**
     * @ManyToMany(targetEntity="Tag", inversedBy="trips")
     * @JoinTable(name="trip_tag")
     */
    private $tags;

    public function __construct() {
        $this->tag s= new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

/** @Entity */
class Tag
{
    // ...
    /**
     * @ManyToMany(targetEntity="Trip", mappedBy="tags")
     */
    private $trips;

    public function __construct() {
        $this->trips = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

А потом строить свой DQLс некоторой агрегацией

$tagIds = [1,2];
$qb = $this->createQueryBuilder('trip');
$qb ->addSelect('COUNT(tags.id) AS total_tags')
    ->leftJoin('trip.tags', 'tags')
    ->add('where', $qb->expr()->in('tags', $tagIds))
    ->groupBy('trip.id')
    ->having('total_tags = @numberOfTags')
    ->getQuery()
    ->getResult();

многие-ко-многим, двунаправленные

Doctrine2 получить объект без отношений

Symfony2 - Doctrine2 QueryBuilder ГДЕ В поле ManyToMany

...