Yii2 ActiveRecord缓存

时间:2015-04-24 18:26:30

标签: caching activerecord yii yii2

如何为Yii 2使用ActiveRecotd缓存?我在官方文档中找不到任何例子。在谷歌我发现了2个例子,首先是:

var hasher = new Hasher(config.idHasherSalt, '0123456789abcdefghijklmnopqrstuvxyz');

但它不适用于$db = self::getDb(); $object = $db->cache(function ($db) use($id) { return self::findOne($id); }); ,我使用更新的框架进行了测试。其他例子是:

Model

它工作正常,但不是ActiveRecord缓存它的数据缓存,所以我们在Yii 2中没有ActiveRecord缓存?

3 个答案:

答案 0 :(得分:6)

1)使用缓存:

$db = Yii::$app->db;// or Category::getDb()
$result = $db->cache(function ($db) use ($id) {
    return Category::find()->where(['id' => $id])->all();
}, CACHE_TIMEOUT);

2)如果您可以使用查询依赖项,请使用:

$db = Yii::$app->db;// or Category::getDb()
$dep = new DbDependency();
$dep->sql = 'SELECT count(*) FROM category';
$result = $db->cache(function ($db) use ($id) {
    return Category::find()->where(['id' => $id])->all();
}, CACHE_TIMEOUT, $dep);

答案 1 :(得分:3)

我也遇到了麻烦。这是我暂时解决hasOne()关系的方法。

public function getGroup()
{
    if(isset(static::$_getGroup[$this->id])) {
        return static::$_getGroup[$this->id];
    }
    $Group = $this->hasOne(BillChargesGroup::className(), ['id' => 'group_id'])->one();
    static::$_getGroup[$this->id] = $Group;
    return $Group;
}

我只想缓存当前请求的数据,因此这有效。但是因为我正在使用->one();,如果我们调用$model->getGroup()(我发现这对扩展查询很有用),它就不会返回ActiveQuery对象。

不幸的是,如果我确实返回了ActiveQuery对象,Yii2会对它做一些“魔术”,并且总是执行一个我无法控制的SELECT *。

答案 2 :(得分:0)

从2.0.14开始,您可以使用以下快捷方式:

(new Query())->cache(7200)->all();
// and
User::find()->cache(7200)->all();

来源:https://www.yiiframework.com/doc/guide/2.0/en/caching-data