在Symfony2中,我应该使用实体还是自定义存储库

时间:2011-09-10 20:09:43

标签: orm symfony

我正在创建一个新的网络应用程序,并希望在设计方案上提供一些帮助。

我有“存储”对象,每个对象都有许多“消息”对象。我想显示一个显示该商店消息的商店页面。使用Doctrine,我使用http://symfony.com/doc/current/book/doctrine.html

映射了OneToMany

但是,我想以反向时间顺序显示消息。所以我添加了一个:

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

我仍在调用“store”对象,然后调用

$store->getMessages();

现在我想显示已经“验证”的邮件。此时,我不确定如何使用@ORM执行此操作,因此我认为我需要一个自定义的存储库层。

我的问题有两个:

  1. 首先,可以我是使用Entity @ORM框架吗?
  2. 第二,这是正确包装此数据库查询的方法吗?
  3. 我知道我最终想要SQL SELECT * FROM message WHERE verified=1 AND store_id=? ORDER BY myTime DESC但是如何将其作为“Symfony2方式”?

1 个答案:

答案 0 :(得分:2)

对于你问题的第一部分......从技术上讲,我认为你可以做到这一点,但我认为你不能以有效的方式做到这一点,或者一种不违背良好做法的方式(即将实体经理注入您的实体)。

你的问题很有意思,因为乍一看,我也会考虑使用$store->getMessages()。但是由于您的自定义标准,我认为您最好使用Message的自定义存储库类。然后你可能会有像

这样的方法

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

$messageRepo->getForStoreWhereVerified($storeId)

现在,您可以使用$store->getMessagesWhereVerified()等方法从Store实体执行此操作,但我认为您将污染商店实体,特别是如果您需要越来越多的这些自定义方法。我认为通过将它们保存在Message存储库中,您可以更清晰地分离您的关注点。此外,使用Message存储库,您可以通过而不是首先获取Store对象来保存自己的查询,因为您只需查询Message表并在其中使用其store_id WHERE子句。

希望这有帮助。