2012-04-01 63 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