我正在尝试缓存,然后从缓存中检索我在数据库中的用户列表。
我有这个:
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();
}
我第一次打开页面时(当列表未缓存时)我得到一个填充的集合对象,但是稍后当从缓存中检索用户列表时,集合为空,我不知道如何加载这些物品。
我尝试查看Doctrine文档但找不到任何内容。我对Doctrine很新。
PS。我不想将文章标记为渴望加载,因为我并不总是需要它们。
答案 0 :(得分:1)
你真的不能。实体实例必须由EntityManager管理,否则无法加载数据。
从缓存加载后,您可以将实体合并回EntityManager,这会使关系的延迟加载再次起作用,但合并本身会执行查询以与数据库同步,因此没有任何好处,只有问题。尽可能避免合并。
您可以在Doctrine中使用buildin结果缓存,而不是使用自定义缓存。
$qb = $em->getRepository(User::class)
->createQueryBuilder('u')
->leftJoin('u.articles', 'a');
return $qb->getQuery()
->useResultCache(true, 3600)
->getResult();
相关文章:
答案 1 :(得分:0)
加入文章以急切加载它们,而不是标记它们总是急切地加载。像这样的东西
$queryBuilder = $em->getRepository(User::class)->createQueryBuilder('u');
$queryBuilder->leftJoin('u.articles', 'a');
$users = $queryBuilder->getQuery()->getResult();