Ich habe folgende Frage:Doctrine2-Repository, Viele-zu-viele-Assoziationen und Twig-Vorlagen: Best Practices
Stellen Sie sich vor, wir haben eine Entität, z. Ereignis.
In EventRepository Klasse Ich habe einige Methoden für die Abfrage einer Art von Ereignissen hinzugefügt. In der EventController habe ich eine Sammlung von Events. Letzter Schritt - alle diese Ereignisse in der Vorlage anzeigen. Im Grunde gibt es nichts schwierig:
{% for event in events %}...{% endfor %}
Aber ich habe eine zusätzliche Bedingung: Ich brauche Benutzer anzuzeigen, die geht an der jedes Ereignis (beispielsweise 10 Benutzer für jeden). Ereignis, das mit dem Benutzer mit Many-to-Many-Verknüpfung verknüpft ist. Ok, ich habe dem EventRepository eine Methode hinzugefügt, um Event-Teilnehmer zu finden. Aber ich habe keinen Zugriff auf die EventRepository in Twig Vorlage ... :(
Ich sehe drei Möglichkeiten:
- (schnell und knifflige) Holen Sie Teilnehmer direkt von der Entity:
{% for event in events %}{% set participants = event.participants %}{% endfor %}
Dies funktioniert, aber wenn. Wir werden Teilnehmer 1000+ haben? Afaik event-> getParticipants() wird alle 1000+ Benutzer gleichzeitig abfragen, die meine Seite brechen. - übergeben EventRepository-Instanz in temlpate und Abfrage 10 Benutzer für jedes Ereignis, etwa so:
{% for event in events %}{% set participants = eventRepository.getEventParticipants(event.id, max) %}{% endfor %}
. Dies sieht korrekter aus, aber sieht so aus, als ob Kern-MVC-Konzepte - Abfragen von Datenbank innerhalb von Vorlagen. - Schleifen Sie Ereignisse im Controller und bereiten Sie die Teilnehmerliste für jeden vor. Sieht hässlich aus (zumindest doppelte Schleife für Ereignisse und mehr Code im Controller), aber mehr oder weniger richtig (und was muss getan werden, wenn neue Bedingungen auftreten?).
Können Sie irgendeinen Rat für diesen Fall annehmen? Wie muss ich N-N-Beziehung und wo in meinem Code abfragen?
Ich habe gültige Beziehung. Und ich benutze jetzt event.participants ($ event-> getParticipants()) wie du vorgeschlagen hast. Aber ** ich kann die Auswahl nicht beschränken **. Ich brauche nur 5-10 Benutzer. Aber Event kann 1000+ Teilnehmer haben. Ich brauche sie nicht alle in diesem Fall. –
Wenn Sie das ArrayCollection-Objekt verwenden, stehen Ihnen Filteroptionen zur Verfügung. Wenn nicht, könnten Sie entweder einen Parameter übergeben, um die Ergebnisse zu begrenzen, oder eine separate Methode für diesen Fall erstellen. –
Wie kann ich ArrayCollection filtern (sieht so aus, als würde die Filterung auch alle verwandten Teilnehmer durchlaufen)? Ich habe getter in Event entity generiert: es gibt einfach $ this -> Teilnehmer zurück (alle Teilnehmer meine ich!).Guter Punkt - um 'EventRepository :: getParticipants ($ eventId, $ max) 'zu verwenden, aber ich kann es nicht in der Vorlage verwenden (verletzt MVC-Kernkonzepte meiner Meinung nach) –