从缓存中检索实体时获取相关的 Doctrine2 实体



我正在尝试缓存,然后从缓存中检索数据库中的用户列表。

我有这个:

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();

相关内容

  • 没有找到相关文章

最新更新