【问题标题】:Is Propel caching criteria when getting related objects?获取相关对象时是否推进缓存标准?
【发布时间】:2013-03-15 18:54:17
【问题描述】:

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

【问题讨论】:

    标签: php propel


    【解决方案1】:

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

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

    我不认为有充分的理由把它拿出来,在幕后,Propel 只是创建一个新的 Criteria 对象,克隆你传入的那个 - 因此没有保存真正的内存。

    【讨论】:

    • (是的,你对变量名的看法是对的,感谢 j0k 清理它。)我有点明白你在说什么。但我原以为 Propel 会生成一个新的 WHERE Init.Id = ?每次循环中的条件。但我猜它没有这样做?
    • 我不认为它会......但我不是 100% 确定。可能还有其他事情发生,但即使是这样,我认为罪魁祸首也不是你的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多