这个问题今天得到了我,我的存储库应该总是返回完整的对象?他们不能返回部分数据(例如在数组中)?
例如,我在我的存储库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';
这些方法在我的服务类中执行。
答案 0 :(得分:1)
从数据库的角度来看,性能不会受到字段数量的影响,除非要返回的行数真的很大(可能是数百万行):db最难的部分是制作关节,并从表中构建结果集。
从PHP的角度来看,这取决于多种因素,例如复杂性和创建的对象数量。
我会以不同的方式解决问题:我会对我的代码进行分析和压力测试以查看性能是否是一个问题,并且只在需要时决定重构(从教条转换为手工制作的模型是时间消费,性能增益值得吗?)
编辑:并回答您的初始问题:如果需要,获取完整对象将导致更轻松的缓存,以及更好的数据封装。我会保留这些,直到它们代表一个重大的性能问题。
答案 1 :(得分:1)
您可以在DQL中使用partial关键字:http://www.doctrine-project.org/docs/orm/2.0/en/reference/partial-objects.html?highlight=partial
但只有在您的应用出现性能问题时才会这样做。