symfony - 如何在 Symfony 中将 CacheInterface 与 Paginator 一起使用?
问题描述
我正在尝试使用 Symfony 5.3.9 中的 CacheInterface 缓存我的查询。我收到“无法保存数组类型的密钥“my_key”。” 当我使用返回 Paginator 项目的自定义查询时,它与经典查询完美配合。
如何使用 Paginator 缓存我的查询?代码示例,我的控制器:
public function index(EventRepository $eventRepo, AnalysisRepository $analysisRepo, UserContestRepository $userContestRepo, CacheInterface $cache): Response
{
$events = $cache->get('events_index', function(ItemInterface $item) use($eventRepo) {
$item->expiresAfter(1800);
return $eventRepo->getUpcoming(6);
});
$highlight = $cache->get('highlight_index', function(ItemInterface $item) use($userContestRepo) {
$item->expiresAfter(1800);
return $userContestRepo->findHighlight(3);
});
return $this->render('home/index.html.twig', [
'controller_name' => 'HomeController',
'curr_nav' => 'home',
'events' => $events,
'highlight' => $highlight,
]);
我的 userContestRepository :
public function findHighlight(int $limit = 0) {
$qb = $this->createQueryBuilder('uc')
->leftJoin('uc.user', 'ucu')
->addSelect('ucu')
->leftJoin('uc.contest', 'ucc')
->addSelect('ucc')
->where('ucc.slug = :slug')
->andWhere('ucu.isActive = true')
->setParameter('slug', 'en-vogue')
->orderBy('uc.points', 'DESC')
;
if ($limit > 0) {
$qb->setMaxResults($limit);
return new Paginator($qb, $fetchJoin = true);
}
return $qb->getQuery()->getResult();
}
还有我的 EventRepository :
public function getUpcoming(int $limit = 0, $sport = 'soccer', $onlyVisibleAnalysis = true)
{
$dateD = new DateTime();
$dateD->modify('+7 day');
$now = new \DateTime("NOW");
$now->modify("-3 hour");
$qb = $this->createQueryBuilder('e')
->leftJoin('e.competition', 'ec')
->addSelect('ec');
if($onlyVisibleAnalysis == true) {
$qb->leftJoin('e.analyses', 'ea', 'WITH', 'ea.isVisible = true')
->addSelect('ea');
}
else {
$qb->leftJoin('e.analyses', 'ea')
->addSelect('ea');
}
$qb->leftJoin('e.homeTeam', 'eht')
->addSelect('eht')
->leftJoin('e.awayTeam', 'eat')
->addSelect('eat')
->orderBy(("DATE_FORMAT(e.eventDate,'%d-%M-%Y')"), 'ASC')
->addOrderBy('SIZE(e.analyses)', 'DESC')
->addOrderBy('e.eventDate', 'ASC')
->where('e.eventDate BETWEEN :now AND :date')
->andWhere('e.sport = :sport')
->setParameter('date', $dateD)
->setParameter('now', $now)
->setParameter('sport', $sport);
if($limit > 0) {
$qb->setMaxResults($limit);
return new Paginator($qb, $fetchJoin = true);
}
return $qb->getQuery()
->getResult();
}
提前谢谢你,希望我在 StackOverflow 上提供了我是新手的所有细节 :)
解决方案
推荐阅读
- javascript - 接受字符串并返回字符串或接受 void 并返回 void 的函数的类型是什么?
- angular - 英雄之旅中 HttpClientInMemoryWebAPI 的问题
- powershell - Powershell检查文件是否存在
- iis - 非域加入 Web 服务器上的 WebDav Windows 身份验证
- elasticsearch - Elasticsearch "match_phrase" 查询和 "fuzzy" 查询 - 都可以结合使用
- sitecore - 如何在 Sitecore 9.1 中获取匿名联系人 ID?
- html - z-index 在形状的一半
- python - Pandas:找到每 m 行的 n 个最小值
- rascal - 如何从流氓地图中获取所有键?
- zend-framework - Zend 将翻译器配置从 module.config.php 移动到 Module.php