Yii2:如何缓存活动数据提供者?
Yii2 : how to cache active data provider?
在我的 PostSearch 模型中,我有以下代码:
public function search($params)
{
$query = Post::find()->where(['status' => 1]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort'=> ['defaultOrder' => ['id' => SORT_DESC]],
'pagination' => [
'pageSize' => 10,
]
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'status' => $this->status,
]);
$query->andFilterWhere(['like', 'title', $this->title])
->andFilterWhere(['like', 'text', $this->text]);
return $dataProvider;
我的尝试,而不是上面的行 return $dataProvider
,将是这个代码块:
$dependency = [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
];
$result = self::getDb()->cache(function ($db) {
return $dataProvider;
}, 3600, $dependency);
return $result
我想根据 updated_at 字段缓存 ADP 返回的结果。我的意思是我想从缓存中提供数据,直到做出一些改变。我的代码不起作用,我的意思是根本没有应用缓存。我做错了什么,是否可以在 ADP 上执行此操作?谢谢
在实例化之后缓存数据提供者几乎没有用处,因为在数据库准备好之前它实际上不会对数据库进行任何选择。所以你实际上会像现在一样缓存一个空对象实例。
如果您有非常大的记录集,请在缓存中提前调用 dataProviders 的 prepare()
:
self::getDb()->cache(function ($db) use ($dataProvider) {
$dataProvider->prepare();
}, 3600, $dependency);
return $dataProvider;
这实际上会缓存 dataProvider
运行的任何查询,因此下次它们将从查询缓存中获取。这应该会导致您正在寻找什么。
如果您的记录数量有限,一次缓存它们也可以:
$key = 'MyCachedData'; // + Data uniquely referring to your search parameters
$cache = \Yii::$app->cache;
$dataProvider = $cache->get($key);
if (!$dataProvider) {
$dependency = \Yii::createObject([
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
]);
$dataProvider = new \yii\data\ArrayDataProvider;
$dataProvider->allModels = $query->all();
$cache->set($key, $dataProvider, 3600, $dependency)
}
return $dataProvider;
显然这对于较大的数据集来说不太理想,但这取决于您要查找的内容。
在我的 PostSearch 模型中,我有以下代码:
public function search($params)
{
$query = Post::find()->where(['status' => 1]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort'=> ['defaultOrder' => ['id' => SORT_DESC]],
'pagination' => [
'pageSize' => 10,
]
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'status' => $this->status,
]);
$query->andFilterWhere(['like', 'title', $this->title])
->andFilterWhere(['like', 'text', $this->text]);
return $dataProvider;
我的尝试,而不是上面的行 return $dataProvider
,将是这个代码块:
$dependency = [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
];
$result = self::getDb()->cache(function ($db) {
return $dataProvider;
}, 3600, $dependency);
return $result
我想根据 updated_at 字段缓存 ADP 返回的结果。我的意思是我想从缓存中提供数据,直到做出一些改变。我的代码不起作用,我的意思是根本没有应用缓存。我做错了什么,是否可以在 ADP 上执行此操作?谢谢
在实例化之后缓存数据提供者几乎没有用处,因为在数据库准备好之前它实际上不会对数据库进行任何选择。所以你实际上会像现在一样缓存一个空对象实例。
如果您有非常大的记录集,请在缓存中提前调用 dataProviders 的 prepare()
:
self::getDb()->cache(function ($db) use ($dataProvider) {
$dataProvider->prepare();
}, 3600, $dependency);
return $dataProvider;
这实际上会缓存 dataProvider
运行的任何查询,因此下次它们将从查询缓存中获取。这应该会导致您正在寻找什么。
如果您的记录数量有限,一次缓存它们也可以:
$key = 'MyCachedData'; // + Data uniquely referring to your search parameters
$cache = \Yii::$app->cache;
$dataProvider = $cache->get($key);
if (!$dataProvider) {
$dependency = \Yii::createObject([
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
]);
$dataProvider = new \yii\data\ArrayDataProvider;
$dataProvider->allModels = $query->all();
$cache->set($key, $dataProvider, 3600, $dependency)
}
return $dataProvider;
显然这对于较大的数据集来说不太理想,但这取决于您要查找的内容。