假设我有两个Doctrine实体:
用户和消息
每个用户都可以收到'n'个消息。
现在我想显示用户的邮箱,所以我从ORM获取用户实体,然后从这个实体获取所有消息。到目前为止没问题。
但是现在我希望对消息进行更复杂的过滤。例如:最大年龄,最大计数,将某些单词列入黑名单等。因此,获取消息的实体的默认getter方法是不够的。
我该如何解决这个问题?
实体存储库是我发现的第一件事,但后来我不得不从用户对象外部询问这个代理,这破坏了用户和消息的关系(repository-> getMessagesForUser(userId,...)而不是用户 - > getMessages(...))对我来说看起来不像是一个“干净”的OOP解决方案。
我能想到的另一种方法是忽略所有这些花哨的ORM东西并编写我自己的模型并从数据库中获取最低ORM甚至DBAL层的信息。以太包装实体或手动填充我自己的模型的字段。但后来我问自己:“为什么我使用Doctrine?”。
那么这个案例的最佳做法是什么。顺便说一句,我使用Symfony 2。
答案 0 :(得分:2)
在这种特定情况下,我肯定会使Message成为自己的aggregate,因此会为它创建一个Repository,并删除User与Message之间的关系。无论如何,用户可以拥有许多消息,因此使用其他方法效率非常低。
然后我会在MessageRepository中创建特定的方法:
class MessageRepository
{
public function findByUser(User $user) {
// ...
}
public function findReadMessagesByUser(User $user) {
// ...
}
}