2011-07-22 33 views
10

我正在设计一个房间预订系统,它有九个实体,它们都相互关联。在这个特定的实例中,我从具有25个属性的实体entry中检索10-30行。每个条目有一个room其中有10个属性。我需要所有参赛资料以及entry->room->identry->room->name。但是,当我使用Query::HYDRATE_ARRAY时,似乎教条正在加载整个room。它似乎是更容易延迟加载Query::HYDRATE_OBJECTDoctrine2 ...最佳保湿模式?

所以,我想知道是否使用Query::HYDRATE_OBJECT模式比Query::HYDRATE_ARRAY/Query::HYDRATE_SCALAR/Query::HYDRATE_SINGLE_SCALAR更快或“更好”。由于我重复使用了一些旧代码,我希望使用HYDRATE_ARRAY,但前提是它不会减慢应用程序的速度。

回答

13

我的2美分:

HYDRATE_OBJECT是最好的,当你计划使用大量的业务逻辑与你的对象的。特别是如果你正在做大量的数据操作。这也可能是最慢的(取决于情况)。

HYDRATE_ARRAY通常只在需要结果和1度关系数据时才会保留,并且仅用于打印/查看目的。

HYDRATE_NONE是另一个我使用时,我只选择一个非常小的数据子集(如一个或两个字段,而不是整个行)。这很像一个原始查询结果。

这也可能是感兴趣http://www.doctrine-project.org/2010/03/17/doctrine-performance-revisited.html

这是从1.2文档,但我认为,水合提示2.0 http://doctrine.readthedocs.org/en/latest/en/manual/improving-performance.html

应用属于此类别中是另一个重要的规则:只取对象当你真的需要他们时。学说有能力获取“数组图”而不是对象图。乍一看这听起来很奇怪,因为为什么首先使用对象关系映射器呢?花点时间考虑一下。 PHP本质上是一种先进的语言,它具有很多用于体面OOP的功能。数组仍然是您可以在PHP中使用的最有效的数据结构。对象在用于完成复杂的业务逻辑时具有最大的价值。这是对资源的浪费,当数据被包裹在昂贵的对象结构,当你没有这方面的

效益使用HYDRATE_ARRAY

你能想到的有对象的视图中的任何好处,而不是数组?你不会在视图中执行业务逻辑,对吗?一个参数可以为你节省很多不必要的处理:

$blogPosts = $q->execute(array(1), Doctrine_Core::HYDRATE_ARRAY); 
+0

这是真的很有帮助!非常感谢! – Daniel

+0

只是一个笔记。 “水合物无”似乎并不存在......这是从1.2开始的吗?我使用'HYDRATE_SCALAR'和'HYDRATE_SINGLE_SCALAR'来代替。 – Daniel

+0

@丹尼尔你可能是对的。我只用了1.2,但'SCALAR'方法看起来与'HYDRATE_NONE'有相同的好处。 –