如何为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缓存?
答案 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