0

我有一个 Propel 1.6 生成的类 Group,它具有与之相关的 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()不为空,它将始终从数据库中获取结果。也许其他一些 Propel 缓存?

4

1 回答 1

1

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

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

不过,我认为没有充分的理由将其拉出来,在幕后 Propel 只是创建了一个新的 Criteria 对象,克隆了您传入的对象 - 因此没有保存真正的内存。

于 2013-03-15T20:07:45.987 回答