Доктрина Заказать коллекцию OneToMany - PullRequest
0 голосов
/ 01 марта 2019

Здравствуйте, я пытаюсь упорядочить коллекцию доктрин по нескольким полям

пробовал что-то вроде этого

  /**
     * @var Collection
     * @ORM\OrderBy({"date" = "ASC","TimeBegin" = "ASC"})
     * @ORM\OneToMany(targetEntity="Schedule", mappedBy="event")
     */
    protected $schedules;

Этот код не работает

Поле даты в формате"1927-12-01" timeBegin "00:13:01"

Это мой запрос

 public function getAppointmentDetails(int $eventId): ?Event
    {

        $eventAlias = 'event';
        /** @var EventQueryBuilder $queryBuilder */
        $queryBuilder = $this->createQueryBuilder($eventAlias);

        $queryBuilder->select($eventAlias)
            ->whereEventId($eventId)
            ->withRoom()
            ->withService()
            ->withSchedulesAndInstructorsOrderedByDateAndTime();


        $appointmentDetails = $queryBuilder->getQuery()->getOneOrNullResult();

        return $appointmentDetails;
    }

и мой метод withSchedulesAndInstructorsOrderedByDateAndTime

 /**
     * With Schedules And Instructors Ordered by Date and Time
     * @return EventQueryBuilder
     */
    public function withSchedulesAndInstructorsOrderedByDateAndTime() : EventQueryBuilder
    {
        $this->join($this->getRootAliases()[0] . '.schedules', 'sc');
        $this->join('sc' . '.instructors', 'in');

        return $this;
    }

Дело в том, чтоесли я добавлю заказ, моя коллекция инструкторов будет пустой

1 Ответ

0 голосов
/ 08 марта 2019

Как указывается в документации:

Чтобы сохранить воздействие на базу данных на низком уровне, эти неявные элементы ORDER BY добавляются в запрос DQL только в том случае, если коллекция извлекается из выборки в запросе DQL.

Так что вам нужно сделать выборочное объединение, добавив Расписание к вашему выбору:

    /**
     * With Schedules And Instructors Ordered by Date and Time
     * @return EventQueryBuilder
     */
    public function withSchedulesAndInstructorsOrderedByDateAndTime() : EventQueryBuilder
    {
        $this->addSelect('sc');
        $this->join($this->getRootAliases()[0] . '.schedules', 'sc');
        $this->join('sc' . '.instructors', 'in');

        return $this;
    }
...