2012-04-01 68 views
4

我有以下问题:Doctrine2存储库,多对多关联和树枝模板:最佳做法

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

In EventRepository class我添加了一些查询某种事件的方法。

EventController我有一个事件的集合。最后一步 - 在模板中显示所有这些事件。基本上没有什么困难:

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

但我有一个附加条件:我需要显示的用户谁去给每个事件(例如,10个用户为每个)。通过多对多关联与用户关联的事件。好吧,我已经在EventRepository中添加了方法来查找事件参与者。但我不得不在嫩枝模板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. 控制器中的循环事件并为每个参与者列出参与者列表。看起来很丑陋(至少在事件和控制器中有更多的代码循环),但或多或​​少是正确的(当出现新的情况时需要做什么?)。

您能否对此案件提出任何建议?我需要如何查询N-N关系和我的代码中的哪个位置?

回答

1

只要您的关系在您的Event实体上正确设置,您应该能够在需要时延迟加载用户。因此,例如,遍历您的活动时,你应该能够调用..

$event->getUsers(); 

Doctrine2真的是非常适合于这些精确的操作类型(延迟加载内容时,其所需的)。

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

+0

我有有效的关系。我现在使用event.participants($ event-> getParticipants()),正如你所建议的那样。但**我不能限制选择**。我只需要5-10个用户。但事件可以有超过1000人参加。在这种情况下,我不需要他们。 – 2012-04-01 11:03:49

+0

如果您使用ArrayCollection对象,那么您可以使用过滤选项。如果不是,那么你可以传递一个参数来限制结果,或者为这种情况创建一个单独的方法。 – 2012-04-01 11:12:04

+0

如何过滤ArrayCollection(看起来像过滤也会循环所有相关的参与者)?我在Event实体中生成了getter:它只是返回'$ this-> participants'(我的意思是所有参与者!)。好点 - 使用'EventRepository :: getParticipants($ eventId,$ max)',但我不能在模板中使用它(违反核心MVC概念在我看来) – 2012-04-01 11:19:18