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

时间:2017-01-26 19:03:59

标签: php symfony caching doctrine-orm

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

我有这个:

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。我不想将文章标记为渴望加载,因为我并不总是需要它们。

2 个答案:

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