em ->createQueryBuilder() ->select('ts', 't') ->from(TripStopEntity::class, 'ts') ->join('ts.trip', 't') ->where('ts.departure >= :from') ->andWhere('ts.stop = :stop') ->orderBy('ts.departure', 'ASC') ->setMaxResults($count) ->getQuery(); $schedule = collect($query->execute([ 'from' => $from, 'stop' => $this->reference(StopEntity::class, $stop), ])); $this->em->createQueryBuilder() ->select('t', 's', 'st') ->from(TrackEntity::class, 't') ->join('t.stopsInTrack', 's') ->join('s.stop', 'st') ->where('t.id in (:tracks)') ->getQuery() ->execute([ ':tracks' => $schedule->map(function (TripStopEntity $stop) { return $stop->getTrip()->getTrack()->getId(); })->all() ]); return $schedule->map(function (TripStopEntity $entity) use ($stop) { $trip = $entity->getTrip(); $track = $trip->getTrack(); $line = $track->getLine(); /** @var StopEntity $last */ $last = $entity->getTrip()->getTrack()->getStopsInTrack()->last()->getStop(); return Departure::createFromArray([ 'key' => sprintf('%s::%s', $this->id->of($entity->getTrip()), $entity->getDeparture()->format('H:i')), 'scheduled' => $entity->getDeparture(), 'stop' => $stop, 'display' => $last->getName(), 'line' => $this->convert($line), 'track' => $this->convert($track), 'trip' => $this->convert($trip), ]); }); } protected static function getHandlers() { return []; } }