Как объединить другой запрос и порядок по его агрегированной функции в результате построения запросов? - PullRequest
0 голосов
/ 04 февраля 2019

Существуют объекты: Event, EventIncident и Country.
Страна может содержать несколько событий.Событие может содержать несколько инцидентов.

/**
 * @ORM\Entity()
 */
class Country {
    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="App\Entity\Event", mappedBy="country")
     */
    private $events;
}

/**
 * @ORM\Entity()
 */
class Event {
    /**
     * @var Country
     * @ORM\ManyToOne(targetEntity="App\Entity\Country", inversedBy="events")
     */
    private $country;

    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="App\Entity\EventIncident", mappedBy="event")
     */
    private $eventIncidents;
}

/**
 * @ORM\Entity()
 */
class EventIncident {
    /**
     * @var Event
     * @ORM\ManyToOne(targetEntity="App\Entity\Event", inversedBy="eventIncidents")
     */
    private $event;
}

Мне нужно выбрать страны и упорядочить события каждой страны по количеству eventIncident.Как я могу сделать это с помощью querybuilder?

Я пытался использовать 2 отдельных запроса: один для получения событий и их инцидентов, а другой для получения стран и их событий, но это не работает.Возможно, я что-то не так делаю.

$qNumberOfEventIncidents = $this->getEntityManager()->getRepository(Event::class)
    ->createQueryBuilder('e')
    ->select('e, COUNT(ei) AS incidentsNumber')
    ->leftJoin('e.eventIncidents', 'ei')
    ->groupBy('e');  
$query = $this->createQueryBuilder('c')
    ->addSelect('c')
    ->innerJoin('c.events', 'ce')
    ->addSelect('ce')
    ->leftJoin('ei', $qNumberOfEventIncidents)
    ->addOrderBy('ei.incidentsNumber', 'DESC');
...