2017-01-26 26 views
3

私はキャッシュに入れておき、データベースにあるユーザのリストをキャッシュから取得しようとしています。エンティティがキャッシュから取得されたときに関連する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(); 
} 

私は(リストがキャッシュされていない)ページを開く初めて私は人口のコレクションオブジェクトを取得し、それ以降のユーザーのリストがキャッシュから取得されたとき、:

私はこれを持っていますコレクションが空であり、アイテムを読み込む方法がわかりません。

私はDoctrineのドキュメントを見てみましたが、何も見つかりませんでした。私はDoctrineをかなり新しくしています。

PS。私はいつもそれらを必要としないので、記事を熱心なものとしてマークしたくありません。

+0

あなたのキャッシュシステムがどのように機能するかを説明できますか?それは '' serialize() ''と '' unserialize() ''を行いますか? –

+0

私は確信して...私はsymfonyによって提供キャッシュを使用しています... 'キャッシュ本当にないんだけど: アプリは: "Redisの:// localhost" を ' – JohnDoe

+0

ある default_redis_providerをcache.adapter.redis非常に一般的なキャッシングシステムなので、デフォルトではこの種のものはサポートされません。あなたの最善の選択肢は、Doctrineのような特定のキャッシングシステムを自分の第2レベルのキャッシュとして使うことだと思います。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/second-level-cache.htmlを参照してください。別のオプションは、 '$ em-> refresh($ user)'すべてのアイテムですしかし、それはキャッシングの目的を破るものです。 –

答えて

0

いつも熱心に読み込まれているように印を付けるのではなく、目を見張るように記事に参加してください。そのようなもの

$queryBuilder = $em->getRepository(User::class)->createQueryBuilder('u'); 
$queryBuilder->leftJoin('u.articles', 'a'); 
$users = $queryBuilder->getQuery()->getResult(); 
1

本当にできません。エンティティインスタンスはEntityManagerで管理する必要があります。それ以外の場合は、データをロードする方法がありません。

キャッシュからロードされたエンティティをマテリアントにマージすると、リレーションの遅延ロードが再び機能しますが、マージ自体がデータベースと同期するクエリを実行するため、そこにはメリットはありません問題。可能であれば、合併は避けるべきです。

カスタムキャッシングを使用する代わりに、Doctrineでbuildin結果キャッシュを使用できます。

$qb = $em->getRepository(User::class) 
    ->createQueryBuilder('u') 
    ->leftJoin('u.articles', 'a'); 

return $qb->getQuery() 
    ->useResultCache(true, 3600) 
    ->getResult(); 

関連記事:

関連する問題