我正在设计一个房间预订系统,它有九个实体,它们都是相互关联的。在这个特定的例子中,我从实体entry
检索10-30行,它有25个属性。每个条目都有一个room
,其中包含10个属性。我需要所有条目信息以及entry->room->id
和entry->room->name
。但是当我使用room
时,似乎教条正在加载整个Query::HYDRATE_ARRAY
。它似乎更容易在Query::HYDRATE_OBJECT
中加载延迟。
所以,我想知道使用Query::HYDRATE_OBJECT
模式是否比Query::HYDRATE_ARRAY
/ Query::HYDRATE_SCALAR
/ Query::HYDRATE_SINGLE_SCALAR
更快或更好。由于我正在重用一些旧的代码,我想使用HYDRATE_ARRAY
,但前提是它不会减慢应用程序的速度。
答案 0 :(得分:15)
我的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
属于此类别的另一个重要规则是:仅在您真正需要时才获取对象。 Doctrine能够获取“数组图”而不是对象图。乍一看,这可能听起来很奇怪,因为为什么首先使用对象关系映射器呢?花点时间考虑一下。 PHP本质上是一种先前的语言,它已被增强,具有很多适合OOP的功能。数组仍然是您可以在PHP中使用的最有效的数据结构。当对象用于完成复杂的业务逻辑时,它们具有最大的价值。当数据被包含在昂贵的对象结构中时,如果没有这种优势,那就浪费了资源
使用HYDRATE_ARRAY
:
您能想到在视图中使用对象而不是数组的任何好处吗?您不会在视图中执行业务逻辑,是吗?一个参数可以为您节省大量不必要的处理:
$blogPosts = $q->execute(array(1), Doctrine_Core::HYDRATE_ARRAY);