Skip to content

Commit ca57222

Browse files
authored
Merge pull request #8023 from peterkeatingie/query-cache-fix
Put into cache using root entity name
2 parents 445796a + 9bb2bf0 commit ca57222

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

lib/Doctrine/ORM/Cache/DefaultQueryCache.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,12 @@ public function put(QueryCacheKey $key, ResultSetMapping $rsm, $result, array $h
279279

280280
$region = $persister->getCacheRegion();
281281

282+
$cm = $this->em->getClassMetadata($entityName);
283+
assert($cm instanceof ClassMetadata);
284+
282285
foreach ($result as $index => $entity) {
283-
$identifier = $this->uow->getEntityIdentifier($entity);
284-
$entityKey = new EntityCacheKey($entityName, $identifier);
286+
$identifier = $this->uow->getEntityIdentifier($entity);
287+
$entityKey = new EntityCacheKey($cm->rootEntityName, $identifier);
285288

286289
if (($key->cacheMode & Cache::MODE_REFRESH) || ! $region->contains($entityKey)) {
287290
// Cancel put result if entity put fail
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace tests\Doctrine\Tests\ORM\Functional\Ticket;
6+
7+
use Doctrine\ORM\Cache\Region\DefaultMultiGetRegion;
8+
use Doctrine\Tests\Models\Cache\Attraction;
9+
use Doctrine\Tests\Models\Cache\Bar;
10+
use Doctrine\Tests\ORM\Functional\SecondLevelCacheAbstractTest;
11+
12+
class DDC7969Test extends SecondLevelCacheAbstractTest
13+
{
14+
public function testChildEntityRetrievedFromCache() : void
15+
{
16+
$this->loadFixturesCountries();
17+
$this->loadFixturesStates();
18+
$this->loadFixturesCities();
19+
$this->loadFixturesAttractions();
20+
21+
// Entities are already cached due to fixtures - hence flush before testing
22+
$region = $this->cache->getEntityCacheRegion(Attraction::class);
23+
24+
if ($region instanceof DefaultMultiGetRegion) {
25+
$region->getCache()->flushAll();
26+
}
27+
28+
/** @var Bar $bar */
29+
$bar = $this->attractions[0];
30+
31+
$repository = $this->_em->getRepository(Bar::class);
32+
33+
$this->assertFalse($this->cache->containsEntity(Bar::class, $bar->getId()));
34+
$this->assertFalse($this->cache->containsEntity(Attraction::class, $bar->getId()));
35+
36+
$repository->findOneBy([
37+
'name' => $bar->getName(),
38+
]);
39+
40+
$this->assertTrue($this->cache->containsEntity(Bar::class, $bar->getId()));
41+
42+
$repository->findOneBy([
43+
'name' => $bar->getName(),
44+
]);
45+
46+
// One hit for entity cache, one hit for query cache
47+
$this->assertEquals(2, $this->secondLevelCacheLogger->getHitCount());
48+
}
49+
}

0 commit comments

Comments
 (0)