我想在 phalcon 中没有这样的选项,所以它必须在你的代码中实现。
您可以为缓存地址创建一个额外的对象属性,如果它已经被初始化,则返回它:
protected $cachedAddresses = null;
public function getAddresses($params = null) {
if ($this->cachedAddresses === null) {
$this->cachedAddresses = $this->getRelated("addresses", array(
"conditions" => "[OrderAddress].active = 'Y'"
));
}
return $this->cachedAddresses;
}
这可能是一个快速的解决方案,但如果您的代码中有其他关系,重复它会很痛苦。所以为了让它保持干燥,你可以在基本模型中重新定义一个“getRelated”方法,这样它就会尝试返回缓存的关系,如果它们已经被初始化的话。
它可能看起来像这样:
protected $cachedRelations = [];
public function getRelated($name, $params = [], $useCache = true) {
//generate unique cache object id for current arguments,
//so different 'getRelated' calls will return different results, as expected
$cacheId = md5(serialize([$name, $params]));
if (isset($this->cachedRelations[$cacheId]) && $useCache)
return $this->cachedRelations[$cacheId];
else {
$this->cachedRelations[$cacheId] = parent::getRelated($name, $params);
return $this->cachedRelations[$cacheId];
}
}
然后,您可以保留“getAddresses”方法,它只会执行一个数据库查询。如果您需要更新缓存值,请将false 作为第三个参数传递。
而且,这是完全未经测试的,但即使有任何小错误,一般逻辑也应该是清楚的。