我有以下问题:Doctrine2存储库,多对多关联和树枝模板:最佳做法
想象一下,我们有一个实体, 事件。
In EventRepository class我添加了一些查询某种事件的方法。
在EventController我有一个事件的集合。最后一步 - 在模板中显示所有这些事件。基本上没有什么困难:
{% for event in events %}...{% endfor %}
但我有一个附加条件:我需要显示的用户谁去给每个事件(例如,10个用户为每个)。通过多对多关联与用户关联的事件。好吧,我已经在EventRepository中添加了方法来查找事件参与者。但我不得不在嫩枝模板EventRepository进不去... :(
我看到三个选项:
- (快速,刁钻)由实体直接获得参加者:
{% for event in events %}{% set participants = event.participants %}{% endfor %}
这个工作,但是当。我们将让参与者数量超过1000+?Afaik event-> getParticipants()将一次查询所有1000多个用户,这将打破我的页面。 - 将EventRepository实例传递给temlpate并为每个事件查询10个用户,如下所示:
{% for event in events %}{% set participants = eventRepository.getEventParticipants(event.id, max) %}{% endfor %}
。看起来更正确,但看起来像是打破了核心MVC概念 - 查询模板中的数据库。 - 控制器中的循环事件并为每个参与者列出参与者列表。看起来很丑陋(至少在事件和控制器中有更多的代码循环),但或多或少是正确的(当出现新的情况时需要做什么?)。
您能否对此案件提出任何建议?我需要如何查询N-N关系和我的代码中的哪个位置?
我有有效的关系。我现在使用event.participants($ event-> getParticipants()),正如你所建议的那样。但**我不能限制选择**。我只需要5-10个用户。但事件可以有超过1000人参加。在这种情况下,我不需要他们。 – 2012-04-01 11:03:49
如果您使用ArrayCollection对象,那么您可以使用过滤选项。如果不是,那么你可以传递一个参数来限制结果,或者为这种情况创建一个单独的方法。 – 2012-04-01 11:12:04
如何过滤ArrayCollection(看起来像过滤也会循环所有相关的参与者)?我在Event实体中生成了getter:它只是返回'$ this-> participants'(我的意思是所有参与者!)。好点 - 使用'EventRepository :: getParticipants($ eventId,$ max)',但我不能在模板中使用它(违反核心MVC概念在我看来) – 2012-04-01 11:19:18