我有一个Propel 1.6生成的类组,其中包含与之相关的Inits,而Inits具有与它们相关的Resps。很简单。
我不明白这两段Propel代码之间的区别。在第一个中,我在每个循环上重新创建$notDeleted
条件。这段代码完成了我想要的 - 它将所有Resps放入$data
数组。
foreach ($group->getInits() as $init) {
$notDeleted = RespQuery::create()->filterByIsDeleted(false);
foreach ($init->getResps($notDeleted) as $resp) {
$data[] = $resp;
}
}
在第二个代码中,我将$notDeleted
标准从循环中拉出,因为(我认为是)明显的效率原因。这段代码不能按照我想要的方式运行 - 它只从其中一个Inits中获取Resps。
$notDeleted = RespQuery::create()->filterByIsDeleted(false);
foreach ($group->getInits() as $init) {
foreach ($init->getResps($notDeleted) as $resp) {
$data[] = $resp;
}
}
我认为它必须与getResps()
方法如何缓存结果有关,但这不是文档或代码在该方法中的读取方式。文档和代码说如果传递给getResps()
的条件不为null,它将始终从数据库中获取结果。也许其他一些Propel缓存?
答案 0 :(得分:1)
(首先,我猜你的意思是在你的循环中使用$init
与$initiative
。那个或者还有其他一些我们在这里看不到的代码。)
以下是我的猜测:在第二个示例中,您提取了$notDeleted
Criteria
个对象,但每次通过内部foreach
,都会调用getResps($notDeleted)
Propel使用当前filterByInit()
实例在Criteria
实例上执行Init
。这将为SQL添加新的WHERE
条件,但显然Resp
只能有一个Init.Id
值,因此只能得到一个结果。
我认为没有充分的理由说明这一点,但是,Propel正在创建一个新的Criteria对象,克隆你传入的对象 - 因此没有真正的记忆保存。