我正在使用Phalcon,并且模型Order
与模型OrderAddress
具有一对多的关系。我通过以下函数访问这些地址:
public function getAddresses($params = null) {
return $this->getRelated("addresses", array(
"conditions" => "[OrderAddress].active = 'Y'"
));
}
OrderAddress
模型有一个公共属性errors
,我不想将其保存到数据库中。我遇到的问题是,每次我访问getAddresses
函数时,它都会从MySQL重新加载对象,这会完全擦除我为该属性设置的值。
我真的只想加载OrderAddress
个模型一次,这样每次调用getAddresses
都不会再次访问数据库 - 它只是迭代已经收集过的集合加载。
这可能吗?
答案 0 :(得分:1)
我认为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;
}
这可能是一个快速的解决方案,但如果您的代码中有其他关系,那么重复它会很痛苦。因此,为了保持干爽,您可以重新定义“相关”。基本模型中的方法,如果它们已经初始化,它将尝试返回缓存的关系。 它可能看起来像这样:
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”#39;方法原样,它只执行一个数据库查询。如果您需要更新缓存值,请将false
作为第三个参数传递。
并且,这是完全未经测试的,但即使出现任何轻微错误,一般逻辑也应该清楚。