Задать вопрос
wladyspb
@wladyspb
Программист

Как настроить кеширование в Yii2 в relation методе? И возможно ли это?

Код в классе :
public function getRoutes()
    {
        return $this->hasMany(Route::className(), ['place_id' => 'id']);
    }

Пытаюсь сделать кеширование вот так:
$db = self::getDb();
return $db->cache(function ($db){
        return $this->hasMany(Route::className(), ['place_id' => 'id']);
});

ошибок не выдаёт, но и результат не кеширует.
Нашёл на просторах инета ещё вот такую вещь:
return $this->hasMany(Route::className(), ['place_id' => 'id'])->cache(60)->all();

Но она возвращает ошибку, хотя это было бы самое удобное использование кеширования...

UPD:
удалось сделать кеширование снаружи:
$place = Place::getDb()->cache(function ($db) use($hero) {
return Place::find()->where(['id' => $hero->location_id])->with('filteredRoutes')->asArray()->all();
}, 600);
Однако я хочу в relation прописать дополнительные фильтры, и не уверен что они будут правильно учитываться...
  • Вопрос задан
  • 2610 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
vyachin
@vyachin
Ищу работу
Такое сделать в текущей версии фреймворка невозможно. Лучше перенести кеширование выше уровня извлечения данных и чем выше, тем лучше. Хороший вариант www.yiiframework.com/doc-2.0/guide-caching-fragmen...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dyonis
@dyonis
Web разработчик
Я пока тоже только учусь, но вот так у меня работает именно как нужно:

return $this->hasOne(UserProfile::class, ['user_id' => 'id'])->cache(60);

Количество запросов на страницах со списками уменьшилось вдвое (в каждой строке выводится имя пользователя).
Правда не уверен, что это правильно с точки зрения быстродействия (спорный вопрос кто будет быстрее: файловый кэш или БД, которая тоже кэширует одинаковые запросы)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект