У меня есть отношения OneToMany
, в которых одна футбольная команда имеет много игроков. Я хочу перечислить все футбольные команды и показать имя капитана для каждой команды.Symfony2 + Doctrine - Фильтрация
Каждый игрок организация имеет внешний ключ (team_id) и поле «капитан», который установлен на 0 или 1. Я в настоящее время работает следующий запрос:
$teams = $this
->getDoctrine()
->getRepository('FootballWebsiteBundle:Team')
->createQueryBuilder('t')
->setFirstResult(($pageNumber * $resultPerPage) - $resultPerPage)
->setMaxResults($resultPerPage)
->add('where','t.deleted = 0')
->add('orderBy', 't.name DESC')
->getQuery()->getResult();
Затем, когда я петля через каждый команда в веточке я бегу team.getTeamCaptain() GetName(), который является фильтром внутри моей сущности команды:.
public function getTeamCaptain() {
$them = $this->players->filter(function($p) {
return $p->getCaptain() == 1;
});
return $them->first();
}
есть ли лучший способ запустить этот запрос?
Кому-то, кто озадачен этим ответом: последний блок отвечает на заданный вопрос, а остальные говорят об улучшении ситуации, которую нужно было улучшить, но на самом деле ее не спрашивали. – Lighthart
@ Lighthart: нет, пользователь попросил способ оптимизации логики. Его первоначальная версия вызвала запросы N * M + 1 из-за ленивой инициализации коллекции 'Team # players', а затем отдельных игроков в этих коллекциях, чтобы проверить, является ли' player.captain == 1'. Оптимизация только 'getTeamCaptain' по-прежнему вызывает запросы N + 1 для инициализации коллекций. Fetch-join в сборке 'Team # players' уменьшает всю эту логику до' 1' одного запроса. Так что оптимизировать только «getTeamCaptain» здесь было бы недостаточно. – Ocramius
Paginator не имеет к этому никакого отношения. – Lighthart