Php 获取相关对象时是否存在缓存条件?
我有一个Propel 1.6生成的类组,它有与之相关的init,init有与之相关的resp。很简单 我不明白这两段代码之间的区别。在第一个循环中,我在每个循环上重新创建Php 获取相关对象时是否存在缓存条件?,php,propel,Php,Propel,我有一个Propel 1.6生成的类组,它有与之相关的init,init有与之相关的resp。很简单 我不明白这两段代码之间的区别。在第一个循环中,我在每个循环上重新创建$notDeleted标准。这段代码实现了我想要的功能——它将所有resp放入$data数组中 foreach ($group->getInits() as $init) { $notDeleted = RespQuery::create()->filterByIsDeleted(false); fo
$notDeleted
标准。这段代码实现了我想要的功能——它将所有resp放入$data
数组中
foreach ($group->getInits() as $init) {
$notDeleted = RespQuery::create()->filterByIsDeleted(false);
foreach ($init->getResps($notDeleted) as $resp) {
$data[] = $resp;
}
}
在第二段代码中,出于(我认为是)明显的效率原因,我将$notDeleted
标准从循环中拉出。这段代码没有按照我想要的方式工作——它只从一个init获取resp
$notDeleted = RespQuery::create()->filterByIsDeleted(false);
foreach ($group->getInits() as $init) {
foreach ($init->getResps($notDeleted) as $resp) {
$data[] = $resp;
}
}
我认为这一定与getResps()
方法如何缓存结果有关,但该方法中的文档或代码不是这样读取的。文档和代码表明,如果传入getResps()
的条件不为空,它将始终从数据库中获取结果。可能是其他的推进缓存?(首先,我猜您是想在循环中使用$init
而不是$initiative
。或者我们在这里没有看到其他代码。)
下面是我的猜测:在第二个示例中,您拉出了$notDeleted
标准
对象,但每次通过内部foreach
调用getResps($notDeleted)
都会使spreep执行filterByInit()
在条件
实例上使用当前Init
实例。这将向SQL中添加一个新的WHERE
条件,但显然Resp
只能有一个Init.Id
值,因此只有一个结果
不过,我认为没有什么好的理由把它拔出来,在幕后,Propel只是创建了一个新的Criteria对象,克隆了您传入的对象,因此没有保存任何实际内存。(是的,关于变量名,您是对的,感谢j0k对它进行了清理。)我有点明白您的意思了。但我本来希望生成一个新的WHERE Init.Id=?循环中的每次条件。但我猜它没有这么做?我不认为它会。。。但我不是100%肯定。可能还有其他事情发生,但即使是这样,我也不认为你的代码是罪魁祸首。