Как закешировать запрос yii\db\ActiveQuery?

$query = Material::find()
            ->where(['in', 'id_material', $ids])
            ->andWhere('start_publish < :time')
            ->params([':time' => time()])
            ->orderBy(['start_publish' => SORT_DESC]);

$count = $query->count();


Гугл юзал, все, что пробовал - не работает. Ну или я криворукий. Подскажите, буду боагодарен

___

Дело в том, что я так уже пробовал. Запрос идет все так же долго

$query = Material::find()
            ->where(['in', 'id_material', $ids])
            ->andWhere('start_publish < :time')
            ->params([':time' => time()])
            ->orderBy(['start_publish' => SORT_DESC]);

        $count = Material::getDb()->cache(function() use ($query) {
            return $query->count();
        });


Может еще в конфиге чет нужно прописать?

__

с каждым обновлением страницы добавляется бинарный файл /runtime/cache/ee значит кэширует. но почему оно с каждым запросом кэширует? А не достает кэш?

____
убрал время из запроса, вставил компонент в кофиг,

$query = Material::find()
            ->where(['in', 'id_material', $ids])
            ->orderBy(['start_publish' => SORT_DESC]);

        $count = Material::getDb()->cache(function($db) use ($query) {
            return $query->count();
        });


но все равно, с каждым обновлением страницы бинарный файл создается по новой, и какждый запрос выполняется долго
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 3
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Запрос или полученные данные, что бы не делать запрос постоянно?
Все есть тут:
www.yiiframework.com/doc-2.0/guide-caching-data.html
Как вариант:
$data = $cache->get($key);
if ($data === false) {
    $query = Material::find()
            ->where(['in', 'id_material', $ids])
            ->andWhere('start_publish < :time')
            ->params([':time' => time()])
            ->orderBy(['start_publish' => SORT_DESC])
->all();
    $cache->set($key, $data);
}
print_r($data);


Если надо сделать зависимость от count, то по той же ссылке есть тема Cache Dependencies

Так же можно закешировать запрос:
$data= Material::getDb()->cache(function ($db) {
    return Material::find()->where(['in', 'id_material', $ids])
            ->andWhere('start_publish < :time')
            ->params([':time' => time()])
            ->orderBy(['start_publish' => SORT_DESC])->all();
});
Ответ написан
$result = Customer::getDb()->cache(function ($db) {
    return Customer::find()->where(['id' => 1])->one();
});


https://github.com/yiisoft/yii2/blob/master/docs/g...

Раздел кеширование запросов
Ответ написан
Комментировать
@karminski
Senior React.JS Developer
С учётом советов Abdula Magomedov замени $query следующим
$query = Material::find()
            ->where(['in', 'id_material', $ids])
            ->andWhere('start_publish < NOW()')
            ->orderBy(['start_publish' => SORT_DESC]);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы