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" 上调用,显然此处并非如此。
另外,不要存储对象引用。它们都将引用同一个对象和最后获取的记录。
显然使用 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" 上调用,显然此处并非如此。
另外,不要存储对象引用。它们都将引用同一个对象和最后获取的记录。