存储库应该总是返回对象?

时间:2011-08-09 16:34:24

标签: php zend-framework repository-pattern doctrine-orm

这个问题今天得到了我,我的存储库应该总是返回完整的对象?他们不能返回部分数据(例如在数组中)?

例如,我在我的存储库getUserFriends(User $user)中有方法Friends,在这个方法中我执行以下DQL:

$dql = 'SELECT userFriend FROM Entities\User\Friend f JOIN f.friend userFriend WHERE f.user = ?0';

但是这样我返回包含所有属性的用户实体,生成的SQL是User表中所有字段的SELECT。但是,假设我只需要用户朋友的id和名称,那么会有更多有趣(并且快速)获得这些值吗?

$dql = 'SELECT userFriend.id, userFriend.name FROM Entities\User\Friend f JOIN f.friend userFriend WHERE f.user = ?0';

这些方法在我的服务类中执行。

2 个答案:

答案 0 :(得分:1)

从数据库的角度来看,性能不会受到字段数量的影响,除非要返回的行数真的很大(可能是数百万行):db最难的部分是制作关节,并从表中构建结果集。

从PHP的角度来看,这取决于多种因素,例如复杂性和创建的对象数量。

我会以不同的方式解决问题:我会对我的代码进行分析和压力测试以查看性能是否是一个问题,并且只在需要时决定重构(从教条转换为手工制作的模型是时间消费,性能增益值得吗?)

编辑:并回答您的初始问题:如果需要,获取完整对象将导致更轻松的缓存,以及更好的数据封装。我会保留这些,直到它们代表一个重大的性能问题。

答案 1 :(得分:1)

您可以在DQL中使用partial关键字:http://www.doctrine-project.org/docs/orm/2.0/en/reference/partial-objects.html?highlight=partial

但只有在您的应用出现性能问题时才会这样做。