获取相关对象时是Propel缓存标准吗?

时间:2013-03-15 18:54:17

标签: php propel

我有一个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缓存?

1 个答案:

答案 0 :(得分:1)

(首先,我猜你的意思是在你的循环中使用$init$initiative。那个或者还有其他一些我们在这里看不到的代码。)

以下是我的猜测:在第二个示例中,您提取了$notDeleted Criteria个对象,但每次通过内部foreach,都会调用getResps($notDeleted) Propel使用当前filterByInit()实例在Criteria实例上执行Init。这将为SQL添加新的WHERE条件,但显然Resp只能有一个Init.Id值,因此只能得到一个结果。

我认为没有充分的理由说明这一点,但是,Propel正在创建一个新的Criteria对象,克隆你传入的对象 - 因此没有真正的记忆保存。