Doctrine2 ...最好的保湿模式?

时间:2011-07-22 18:42:39

标签: php doctrine-orm

我正在设计一个房间预订系统,它有九个实体,它们都是相互关联的。在这个特定的例子中,我从实体entry检索10-30行,它有25个属性。每个条目都有一个room,其中包含10个属性。我需要所有条目信息以及entry->room->identry->room->name。但是当我使用room时,似乎教条正在加载整个Query::HYDRATE_ARRAY。它似乎更容易在Query::HYDRATE_OBJECT中加载延迟。

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

1 个答案:

答案 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);