我有以下问题:
假设我们有一个实体,例如事件。
在 EventRepository 类中,我添加了一些方法来查询某种事件。
在 EventController 中,我有一个事件集合。最后一步 - 在模板中显示所有这些事件。基本上没什么难的:
{% for event in events %}...{% endfor %}
但我还有一个附加条件:我需要显示参加每个事件的用户(例如,每个事件有 10 个用户)。事件链接到具有多对多关联的用户。好的,我已将方法添加到 EventRepository 以查找事件参与者。但是我无法访问 Twig 模板中的 EventRepository ... :(
我看到三个选项:
- (快速而巧妙)通过实体直接获取参与者:
{% for event in events %}{% set participants = event.participants %}{% endfor %}
。这行得通,但是我们什么时候让参与者计数 1000+? Afaik event->getParticipants() 将立即查询所有 1000 多个用户,这会破坏我的页面。 - 将 EventRepository 实例传递给模板并为每个事件查询 10 个用户,如下所示:
{% for event in events %}{% set participants = eventRepository.getEventParticipants(event.id, max) %}{%结束于 %}
。这看起来更正确,但似乎打破了核心 MVC 概念——在模板中查询数据库。 - 在 Controller 中循环事件并为每个事件准备参与者列表。看起来很难看(至少是事件的双循环和 Controller 中的更多代码),但或多或少是正确的(以及出现新情况时需要做什么?)。
对于这种情况,您能提出什么建议吗?我需要如何查询 N-N 关系以及在我的代码中的什么位置?
最佳答案
只要您在事件实体上正确设置了关系,您就应该能够在需要时延迟加载用户。因此,例如,当遍历您的事件时,您应该能够调用..
$event->getUsers();
Doctrine2 非常适合这些确切类型的操作(在需要时延迟加载内容)。
确保您在事件和用户之间有一个有效的关系,并在您的事件实体中编写一个 getter 以将所有用户作为数组或使用 Doctrine 的 ArrayCollection 类提取。
关于php - Doctrine2 存储库、多对多关联和 Twig 模板 : best practices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963336/