Yii2 ActiveRecord 缓存

Yii2 ActiveRecord cache

Yii 2如何使用ActiveRecotd缓存?我没有在官方文档中找到任何示例。在 Google 中我找到了 2 个示例,第一个是:

$db = self::getDb();
$object = $db->cache(function ($db) use($id) {
    return self::findOne($id);
});

但它不适用于 Model,我用更新的框架进行了测试。其他例子是:

$data = \Yii::$app->cache->get('some_var_' . $id);
if ($data === false)
{
    $data = self::findOne($id);
    \Yii::$app->cache->set('some_var_' . $id, $data, 60);
}

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

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);

我也遇到了这个问题。这是我目前针对 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() 它不会 return ActiveQuery 对象(我发现这对扩展查询很有用)

不幸的是,如果我做 return ActiveQuery 对象,Yii2 会对它做一些 "magic" 并且总是做一个我无法控制的 SELECT *。

从 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