Планирую переписывать проект с PhalconPHP на Yii2. Не вдаваясь в подробности, почему меняю фреймворк, спрошу вот что:
Как в Yii2 можно реализовать глобальное кэширование сущностей?
Пояснение:
Возьмём сущность
User. У
User есть аватарка
Skin. Они связаны. У
Skin есть uploader, т.е. тот, кто её загрузил и, как ни странно, это
User. За тем у нас идут более комплексные сущности:
Comment и
Post (на самом деле их больше).
Comment содержит author, а для вывода на frontend (или ответа по API) нам всегда нужен и
Skin, ибо как же нам без аватарки. У сущности
Post есть такой же author и для нормальной работы нужны всё те же данные. Отсюда получается, что для выборки постов всегда будет использоваться
Post::find()->with('author', 'author.skin')->all()
. А это значит, что у нас постоянно будут следующие запросы:
SELECT * FROM posts
SELECT * FROM users WHERE id IN (...)
SELECT * FROM skins WHERE id IN (...)
И проблему можно было бы как-то решить, если бы просто-напросто в месте объявления связи (том самом геттере, который возвращается ActiveQuery) добавить ->cache(), но это будет кэш только для строго совпадающего набора id, что, по сути, бессмысленно.
Пока мой проект работает на PhalconPHP, я написал внешний класс, который делает примерно следующее: ищет переданные id сущностей в кэше, что может тянет оттуда, а остаток выбирает и кэширует. Так же у меня есть глобальная система тэгирования, кэширование на уровне findFirst() и подобных, но всё же, если честно, это всё больше походит на быдлокод, чем на "крутое решение".
Так вот, продолжу про задачу: на сайте так же существует отдельная страница аватарки и пользователя. И там так же используются эти сущности, вот прям по id. То есть получается, что по сути сущности всегда одинаковые, а за счёт тегирования кэша (что пока тоже для меня загадка в Yii2) ttl у кэша может быть близким к бесконечности.
Из всего вышесказанного вытекают следующие вопросы (более конкретезированные):
- Как реализовать кэширование для findFirst() по сущности и тегам? Тут, конечно, решение напрашивается вполне очевидное, но всё же мб кто-то предложит очень красивый вариант.
- Как реализовать более умную выборку связанных данных, а именно проверку сущностей в кэше, довыборку оставшихся и дальнейшее их кэширование?