【问题标题】:How to get Phalcon to not reload the relation each time I want to access it每次我想访问它时如何让 Phalcon 不重新加载关系
【发布时间】:2015-01-18 05:56:55
【问题描述】:

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

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

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

我真的只希望 OrderAddress 模型加载一次,这样每次调用 getAddresses 就不会再次访问 DB - 它只是遍历已加载的集合。

这可能吗?

【问题讨论】:

    标签: phalcon


    【解决方案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;
    }  
    

    这可能是一个快速的解决方案,但如果您的代码中有其他关系,重复它会很痛苦。所以为了让它保持干燥,你可以在基本模型中重新定义一个“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 作为第三个参数传递。

    而且,这是完全未经测试的,但即使有任何小错误,一般逻辑也应该是清楚的。

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2019-09-30
      • 2021-11-13
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      相关资源
      最近更新 更多