В репозитории. Модель простой POPO, о БД вообще ничего не знает, её единственная область ответственности — моделировать предметную область. Ответственность репозитория — хранить сущности модели, где и как только он знает. Как вариант, да, прокси, реализующий тот же интерфейс, что и «чистый» репозиторий. Другой вариант — кэшировать результаты запросов ещё ниже, где-то на уровне DBAL/DAL. Но на практике только прямо в репозитории реализовывал, что-то вроде
class UserRepository {
public function getById($id) {
if ($this->cache->hasKey('user' . $id)) {
$user = $this->cache->getByKey('user' . $id);
} else {
$user = $this->db->getUserById($id);
$this->cache->set('user' . $id, $user);
}
}