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


我正在设计一个房间预订系统,它有九个实体,它们都是相互关联的。在这个特定的例子中,我正在从实体中检索10-30行 entry 它有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 但只有当它不会减慢应用程序的速度时。


6836
2017-07-22 18:42


起源



答案:


我的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);

14
2017-07-22 18:57



这真的很有帮助!非常感谢! - Daniel
只是一个说明。 HYDRATE NONE 似乎不存在......这是1.2吗?我在用着 HYDRATE_SCALAR 和 HYDRATE_SINGLE_SCALAR 代替。 - Daniel
@Daniel你可能是对的。我只使用了1.2但是 SCALAR 方法似乎产生与以下相同的好处 HYDRATE_NONE。 - Mike B
嗯,你能告诉我定义Doctrine_Core的文件的完整路径吗?我认为我的symfony2安装很不稳定。 - Owen Beresford
@OwenBeresford小心,我的回答是指Doctrine 1.2。 Symfony 2 最有可能的 使用Doctrine 2.水合常数似乎是Doctrine 2中Query类的一部分 docs.doctrine-project.org/en/latest/reference/... - Mike B


答案:


我的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);

14
2017-07-22 18:57



这真的很有帮助!非常感谢! - Daniel
只是一个说明。 HYDRATE NONE 似乎不存在......这是1.2吗?我在用着 HYDRATE_SCALAR 和 HYDRATE_SINGLE_SCALAR 代替。 - Daniel
@Daniel你可能是对的。我只使用了1.2但是 SCALAR 方法似乎产生与以下相同的好处 HYDRATE_NONE。 - Mike B
嗯,你能告诉我定义Doctrine_Core的文件的完整路径吗?我认为我的symfony2安装很不稳定。 - Owen Beresford
@OwenBeresford小心,我的回答是指Doctrine 1.2。 Symfony 2 最有可能的 使用Doctrine 2.水合常数似乎是Doctrine 2中Query类的一部分 docs.doctrine-project.org/en/latest/reference/... - Mike B