2011-09-10 53 views
1

我正在創建一個新的Web應用程序,並希望對設計方案有所幫助。在Symfony2中,我應該使用實體還是自定義存儲庫

我有「存儲」對象,每個對象都有一些「消息」對象。我想展示一個展示此店鋪消息的商店頁面。使用Doctrine,我已經映射OneToMany使用http://symfony.com/doc/current/book/doctrine.html

但是,我想按照反向時間順序顯示消息。所以我增加了一個:

* @ORM\OrderBy({"whenCreated" = "DESC"}) 

不過我打電話了「商店」對象,然後調用

$store->getMessages(); 

現在我想表明,已經被「證實」的消息。在這一點上,我不確定如何使用@ORM來做到這一點,所以我想我需要一個定製的Repository層。

我的問題是雙重的:

  1. 首先,可以我做到這一點使用實體@ORM框架?
  2. 第二,這是正確方式來包裝這個數據庫查詢?

我知道我最終希望SQL SELECT * FROM message WHERE verified=1 AND store_id=? ORDER BY myTime DESC但如何使這個「Symfony2的方式」?

回答

2

對於你的問題的第一部分...從技術上講,我認爲你可以這樣做,但我認爲你不能以有效的方式做到這一點,或者一種不違背良好的方式做法(即將實體經理注入您的實體)。

你的問題是一個有趣的問題,因爲乍一看,我也會想到使用$store->getMessages()。但由於你的自定義標準,我認爲你最好使用消息定製存儲庫類。那麼你可能有這樣

$messageRepo->getForStoreOrderedBy($storeId, $orderBy)

$messageRepo->getForStoreWhereVerified($storeId)方法。

現在,您可以使用像$store->getMessagesWhereVerified()這樣的方法從Store實體執行此操作,但我認爲您會污染商店實體,特別是如果您需要越來越多這些自定義方法。我想通過將它們保留在消息庫中,您可以更清晰地分離您的疑慮。另外,通過消息庫,您可以節省而不是需要首先獲取您的Store對象的查詢,因爲您只需要查詢消息表並在WHERE子句中使用它的store_id即可。

希望這會有所幫助。

相關問題