W moim modelu PostSearch mam ten kod:Yii2: jak buforować aktywnego dostawcę danych?
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;
moje spróbować, zamiast powyższej linii return $dataProvider
, byłby to blok kodu:
$dependency = [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
];
$result = self::getDb()->cache(function ($db) {
return $dataProvider;
}, 3600, $dependency);
return $result
Chciałabym buforować wynik zwracany przez ADP, na podstawie pola updated_at. Chodzi mi o to, że chcę serwować dane z pamięci podręcznej, dopóki nie wprowadzi się jakiejś zmiany. Mój kod nie działa, mam na myśli buforowanie nie jest stosowane w ogóle. Co robię źle, i czy można to zrobić na ADP? Dzięki
Dziękuję, rozwiązanie z funkcją prepare() działa, ale nie rozumiem twojego drugiego kodu bardzo dobrze. Co to jest -> allModels i $ postActiveQuery? Dzięki jeszcze raz. – offline
Właściwie wystarczyło '$ query'. Jest to ta sama zasada co pierwsza, ale zamiast tego pobieramy wszystkie rekordy i przechowujemy je w 'ArrayDataProvider'. Różnica polega na tym, że rzeczywiste modele/atrybuty są buforowane w pamięci podręcznej aplikacji, a nie w wynikach zapytania. Ale jeśli działa pierwszy, to trzymałbym się tego :) – Blizz
@Blizz Przetestowałem twoje pierwsze rozwiązanie, które buforuje zapytanie 'select', ale nie buforuje zapytania' count' w dataProvider. Jak mogę to naprawić, aby buforować selekcje zarówno wybrane, jak i zliczone? Używam 'SqlDataProvider'. – hamed