Phalcon\Mvc\Models - взаимосвязь моделей и кеширование

Вот это в документации Phalcon:

http://docs.phalconphp.com/en/latest/reference/models.html#taking-advantage-of-relationships.

Предположим, у меня есть такой код:

public function initialize()
{
    $this->hasMany("id", "RobotsParts", "robots_id");
}

/**
 * Return the related "robots parts"
 *
 * @return \RobotsParts[]
 */
public function getRobotsParts($parameters=null)
{
    return $this->getRelated('RobotsParts', $parameters);
}

Интересно, каков наилучший подход к кэшированию результатов поиска "->getRelated()"? Это означает, что он не должен обращаться к базе данных, если он вызывается более одного раза.

Спасибо!


person temuri    schedule 06.11.2013    source источник


Ответы (2)


Предполагая, что вы определили свой механизм кэширования в контейнере службы, вы можете сделать это:

public function getRobotsParts($parameters=null)
{
    $di  = \Phalcon\DI::getDefault();
    $key = 'cache_robots_parts_' . $this->id;

    $cache = $di->cache->get($key);

    if (null == $cache) {
        $results = $this->getRelated('RobotsParts', $parameters);
    } else {
        $results = $cache;
    }

    return $results;
}
person Nikolaos Dimopoulos    schedule 06.11.2013
comment
Спасибо, это очевидно. Мне было интересно, имеет ли $obj-›_modelsManager встроенную возможность кэширования. - person temuri; 06.11.2013
comment
Стратегия кэширования существует, но она отключается после завершения запроса. Для получения дополнительной информации вы можете просмотреть этот docs.phalconphp.com/en/latest/reference/ - person Nikolaos Dimopoulos; 06.11.2013

Это может быть записано на коротком пути:

public function getRobotsParts($parameters=null)
{
    $parameters['cache'] = array(
        'lifetime' => 123,
        'key'      => 'cache_robots_parts_' . $this->id,
    );

    return $this->getRelated('RobotsParts', $parameters);
}

Или короче, если $parameters['cache'] установлено в методе, вызвавшем это

person IGeorg    schedule 13.07.2014