开发者

In Symfony2, should I use an Entity or a custom Repository

I am creating a new web app and would like some help on design plans.

I have "store" objects, and each one has a number of "message" objects. I want to show a store page that shows this store's messages. Using Doctrine, I have mapped OneToMany using http://symfony.com/doc/current/book/doctrine.html

However, I want to show messages in reverse chronological order. So I added a:

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

Still I am calling the "store" object, then calling

$store->getMessages();

Now I want to show messages that have been "verified". At this point, I am unsure how to do this using @ORM so I was thinking I need a custom Repository layer.

My question is twofold:

  1. First, can I do 开发者_如何学JAVAthis using the Entity @ORM framework?
  2. And second, which is the correct way to wrap this database query?

I know I eventually want the SQL SELECT * FROM message WHERE verified=1 AND store_id=? ORDER BY myTime DESC but how to make this the "Symfony2 way"?


For part 1 of your question... technically I think you could do this, but I don't think you'd be able to do it in an efficient way, or a way that doesn't go against good practices (i.e. injecting the entity manager into your entity).

Your question is an interesting one, because at first glance, I would also think of using $store->getMessages(). But because of your custom criteria, I think you're better off using a custom repository class for Messages. You might then have methods like

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

and

$messageRepo->getForStoreWhereVerified($storeId).

Now, you could do this from the Store entity with methods like $store->getMessagesWhereVerified() but I think that you would be polluting the store entity, especially if you need more and more of these custom methods. I think by keeping them in a Message repository, you're separating your concerns in a cleaner fashion. Also, with the Message repository, you might save yourself a query by not needing to first fetch your Store object, since you would only need to query to Message table and use its store_id in your WHERE clause.

Hope this helps.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜