Propel "ModelCriteria::FORMAT_ON_DEMAND" 重复使用同一个对象?

Propel "ModelCriteria::FORMAT_ON_DEMAND" reuses same object?

显然使用 ModelCriteria::FORMAT_ON_DEMAND (PropelOnDemandFormatter) 不仅使 Propel hydrate 对象逐行并且没有实例池 as documented,而且水合作用发生在 完全相同的对象.

这意味着下面示例中的 $object 将始终保持不变,只有其内容会发生变化。

$objects = ObjectQuery::create()
    ->setFormatter(ModelCriteria::FORMAT_ON_DEMAND)
    ->find();

foreach ($objects as $object) {
}

如果您的 Propel 对象具有未映射到数据库 table 列但在对象中管理的其他数据,这将成为一个问题。

为什么选择这个设计而不是,比如说,干净地实例化一个对象然后水化它? 处理此设计决策的推荐方法是什么?

我猜这是为了提高性能,因为不需要实例化。

如果您的代码需要使用按需抓取,您可能应该为正在抓取的对象的 class 重写 postHydrate(),以便对 Propel 的数据执行任何必要的对象相关更新不会自动映射到列。

请注意,ensureConsistency() 仅在 "rehydration" 上调用,显然此处并非如此。

另外,不要存储对象引用。它们都将引用同一个对象和最后获取的记录。