PHP - 填充聚合对象 - 最佳实践

时间:2015-04-04 18:16:46

标签: php oop orm data-mapping

我有一个产品对象,它也聚合了一些"对象数组" 属性,类别,颜色,尺寸等 现在我有数据库,其中包含针对每个对象的表格... 产品,属性,类别,颜色,尺寸 等。 现在我检索产品列表的查询有7-8个连接,因为我的数据库有一些其他表,其中包含产品及其相关实体的多对多关系。

一切都很好。现在问题来自于我从PDO检索数据并需要将我的产品与其所有聚合对象一起填充。 我需要制作许多嵌套循环来填充我的Product对象数组,这是一项非常繁琐的活动,而且似乎也不是一个好的编程实践(直觉)。

我不想使用任何ORM,因为在我看来,ORM对于这些连接数来说非常低效。

处理此类情况的最佳做法是什么。

非常感谢你的时间。

编辑:(基于KIKO软件评论)

我的大多数产品检索查询的Where子句都包含与其聚合实体相关的条件,而且正如我之前所写,我也有很多关系。所以这意味着我已经在使用数据库资源"甚至"如果我去懒惰那么,在那种情况下,如果我加载我的结果的子集,那么eager-loading将是更好的选择?如果是这样,我的原始问题再次保持不变;我是否可以逃脱太多嵌套循环来加载聚合对象?

由于

1 个答案:

答案 0 :(得分:0)

您应该在产品对象中获取和设置方法,例如保护,类别,颜色和大小。我通常做的只是在实际需要时才检索这些对象。所以只有当你使用get例程时。这样,您可以非常快速地创建新的产品对象,因为它不会因检索所有数组而变慢,尤其是当您甚至不使用它们时。

正如您在评论中指出的那样,这是调用 lazy-loading :您只需检索所需内容。

我看不出急切加载数据库数据的充分理由。换句话说:尽快加载所有内容。唯一的原因可能是你可以比 lazy-loading 更快地完成它,并且你知道你可能需要所有的数据。

我认为在PDO中你无法做很多事情来加速从不同表中检索几行(除了正常的数据库优化)。 fetchAll()可能比fetch()略快,但这将是微不足道的。所以最好的策略仍然是延迟加载

但是有几种方法可以实现延迟加载。每当调用get方法时,您只能检索请求的行,或者您可以一次性从关联的平板电脑中检索所有需要的行。当要检索大量行时,第一种方法更有效,而您可能只需要其中的一些。当没有很多行要检索时,第二种方法是最佳选择,无论如何你可能还需要大部分行。

所以使用的具体方法取决于您的需求,但在所有情况下延迟加载可能是最好的做法。