如何让Phalcon在每次我想访问它时不重新加载关系

时间:2015-01-18 05:56:56

标签: phalcon

我正在使用Phalcon,并且模型Order与模型OrderAddress具有一对多的关系。我通过以下函数访问这些地址:

  public function getAddresses($params = null) {
    return $this->getRelated("addresses", array(
      "conditions" => "[OrderAddress].active = 'Y'"
    ));
  }  

OrderAddress模型有一个公共属性errors,我不想将其保存到数据库中。我遇到的问题是,每次我访问getAddresses函数时,它都会从MySQL重新加载对象,这会完全擦除我为该属性设置的值。

我真的只想加载OrderAddress个模型一次,这样每次调用getAddresses都不会再次访问数据库 - 它只是迭代已经收集过的集合加载。

这可能吗?

1 个答案:

答案 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作为第三个参数传递。

并且,这是完全未经测试的,但即使出现任何轻微错误,一般逻辑也应该清楚。