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