Репозиторий Doctrine2, ассоциации «многие ко многим» и шаблоны Twig: лучшие практики - PullRequest
4 голосов
/ 01 апреля 2012

У меня следующий вопрос:

Представьте, что у нас есть сущность, например, Событие .

В EventRepository классе я добавил несколько методов для запроса каких-либо событий.

В EventController У меня есть коллекция событий. Последний шаг - отобразить все эти события в шаблоне. В принципе ничего сложного нет:

{% for event in events %}...{% endfor %}

Но у меня есть одно дополнительное условие : мне нужно отобразить пользователей, которые посещают каждое событие (например, 10 пользователей для каждого). Событие, связанное с Пользователем с ассоциацией «многие ко многим». Хорошо, я добавил метод в EventRepository, чтобы найти участников события. Но у меня нет доступа к EventRepository в шаблоне Twig ...: (

вижу три варианта:

  1. (быстро и хитро) Получите участников напрямую от организации: {% for event in events %}{% set participants = event.participants %}{% endfor %}. Это работает, но когда у нас будет более 1000 участников? Afaik event-> getParticipants () будет опрашивать всех 1000+ пользователей сразу, что сломает мою страницу.
  2. передать экземпляр EventRepository в temlpate и запросить 10 пользователей для каждого события, примерно так: {% for event in events %}{% set participants = eventRepository.getEventParticipants(event.id, max) %}{% endfor %}. Это выглядит более правильно, но похоже, что это нарушает основные концепции MVC - запросы к базе данных в шаблонах.
  3. Зацикливание событий в контроллере и подготовка списка участников для каждого. Выглядит некрасиво (по крайней мере, дублирующий цикл для событий и больше кода в контроллере), но более или менее правильно (и что нужно делать, когда появляются новые условия?).

Можете ли вы принять какие-либо советы для этого случая? Как мне нужно запросить отношение N-N и где в моем коде?

1 Ответ

1 голос
/ 01 апреля 2012

Пока ваши отношения правильно установлены в вашей сущности Event, вы должны иметь возможность лениво загружать пользователей, когда они требуются. Так, например, при переборе ваших событий вы должны быть в состоянии позвонить ..

$event->getUsers();

Doctrine2 действительно хорошо подходит для этих точных типов операций (ленивая загрузка содержимого, когда это необходимо).

Убедитесь, что у вас есть правильное отношение между Событиями и Пользователями, и напишите геттер в вашей сущности События, чтобы вытащить всех пользователей в виде массива или с помощью класса ArrayCollection Doctrine.

...