我正在尝试缓存,然后从缓存中检索数据库中的用户列表。
我有这个:
public function listAction()
{
$cache = $this->get('cache.app');
if ($cache->hasItem('users')) {
$item = $cache->getItem('users');
$users = $item->get();
} else {
$item = $cache->getItem('users');
$em = $this->getDoctrine()->getManager();
$users = $em->getRepository(User::class)->findAll();
$item->set($users);
$cache->save($item);
}
$user = $users[0];
dump($user->getArticles());die();
}
第一次打开页面(当列表未缓存时)我得到一个填充的集合对象,但后来当从缓存中检索用户列表时,集合为空,我不知道如何加载项目。
我尝试查看教义文档,但找不到任何东西。我对教义很陌生。
附言。我不想将文章标记为急切加载,因为我并不总是需要它们。
你真的不能。实体实例必须由 EntityManager 管理,否则它无法加载数据。
从缓存加载实体后,您可以将实体合并回 EntityManager,这将使关系的延迟加载再次工作,但合并本身会执行查询以与数据库同步,因此没有好处,只有问题。应尽可能避免合并。
您可以在 Doctrine 中使用内置结果缓存,而不是使用自定义缓存。
$qb = $em->getRepository(User::class)
->createQueryBuilder('u')
->leftJoin('u.articles', 'a');
return $qb->getQuery()
->useResultCache(true, 3600)
->getResult();
相关文章:
- 学说ORM/缓存
- 原则ORM/查询缓存
加入文章以急切加载它们,而不是将它们标记为总是急切加载。类似的东西
$queryBuilder = $em->getRepository(User::class)->createQueryBuilder('u');
$queryBuilder->leftJoin('u.articles', 'a');
$users = $queryBuilder->getQuery()->getResult();