Doctrine2存储库,多对多关联和Twig模板:最佳实践

时间:2012-04-01 09:28:57

标签: php symfony many-to-many doctrine-orm twig

我有以下问题:

想象一下,我们有一个实体,例如事件

EventRepository 类中,我添加了一些查询某种事件的方法。

EventController 中,我收到了一系列事件。最后一步 - 在模板中显示所有这些事件。基本上没有什么困难:

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

但我有一个额外的条件:我需要显示转​​到每个事件的用户(例如每个用户10个用户)。事件链接到具有多对多关联的用户。好的,我已经在EventRepository中添加了方法来查找事件参与者。但我无法访问Twig模板中的EventRepository ... :(

我看到三个选项:

  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. 在控制器中循环事件并为每个事件准备参与者列表。看起来很难看(至少可以在事件中使用dooble循环,在控制器中使用更多代码),但或多或​​少是正确的(以及新条件出现时需要做什么?)。
  4. 你能为这个案子提出任何建议吗?我如何查询N-N关系以及我的代码中的位置?

1 个答案:

答案 0 :(得分:1)

只要在您的Event实体上正确设置了您的关系,您就应该能够在需要时延迟加载用户。因此,例如在迭代您的事件时,您应该能够调用..

$event->getUsers();

Doctrine2非常适合这些确切类型的操作(在需要时延迟加载内容)。

确保事件和用户之间存在有效关系,并在Events实体中编写一个getter,将所有用户拉出为数组,或者使用Doctrine的ArrayCollection类。