From f3e486694e83915473ff8ea7cbf751a5190be2e9 Mon Sep 17 00:00:00 2001 From: abluchet Date: Thu, 13 Oct 2016 12:44:50 +0200 Subject: [PATCH] Eager associations joins are on the same alias in dql --- .../Doctrine/Orm/Filter/AbstractFilter.php | 4 +-- .../Doctrine/Orm/Filter/SearchFilterTest.php | 26 ++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Bridge/Doctrine/Orm/Filter/AbstractFilter.php b/src/Bridge/Doctrine/Orm/Filter/AbstractFilter.php index 638ca129638..74a62f6542c 100644 --- a/src/Bridge/Doctrine/Orm/Filter/AbstractFilter.php +++ b/src/Bridge/Doctrine/Orm/Filter/AbstractFilter.php @@ -256,11 +256,11 @@ private function getExistingJoin(QueryBuilder $queryBuilder, string $alias, stri { $parts = $queryBuilder->getDQLPart('join'); - if (!isset($parts[$alias])) { + if (!isset($parts['o'])) { return; } - foreach ($parts[$alias] as $join) { + foreach ($parts['o'] as $join) { if (sprintf('%s.%s', $alias, $association) === $join->getJoin()) { return $join; } diff --git a/tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php b/tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php index 1fea8652941..5a227a8d220 100644 --- a/tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php +++ b/tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php @@ -702,7 +702,7 @@ public function provideApplyTestData() : array public function testDoubleJoin() { - $request = Request::create('/api/dummies', 'GET', ['relatedDummy.symfony' => 'exact']); + $request = Request::create('/api/dummies', 'GET', ['relatedDummy.symfony' => 'foo']); $requestStack = new RequestStack(); $requestStack->push($request); $queryBuilder = $this->repository->createQueryBuilder('o'); @@ -722,4 +722,28 @@ public function testDoubleJoin() $expected = strtolower(sprintf('SELECT o FROM %s o inner join o.relatedDummy relateddummy_a1 WHERE relateddummy_a1.symfony = :symfony_p1', Dummy::class)); $this->assertEquals($actual, $expected); } + + public function testTripleJoin() + { + $request = Request::create('/api/dummies', 'GET', ['relatedDummy.symfony' => 'foo', 'relatedDummy.thirdLevel.level' => 'bar']); + $requestStack = new RequestStack(); + $requestStack->push($request); + $queryBuilder = $this->repository->createQueryBuilder('o'); + $filter = new SearchFilter( + $this->managerRegistry, + $requestStack, + $this->iriConverter, + $this->propertyAccessor, + null, + ['relatedDummy.symfony' => null, 'relatedDummy.thirdLevel.level' => null] + ); + + $queryBuilder->innerJoin('o.relatedDummy', 'relateddummy_a1'); + $queryBuilder->innerJoin('relateddummy_a1.thirdLevel', 'thirdLevel_a1'); + + $filter->apply($queryBuilder, new QueryNameGenerator(), $this->resourceClass, 'op'); + $actual = strtolower($queryBuilder->getQuery()->getDQL()); + $expected = strtolower(sprintf('SELECT o FROM %s o inner join o.relatedDummy relateddummy_a1 inner join relateddummy_a1.thirdLevel thirdLevel_a1 WHERE relateddummy_a1.symfony = :symfony_p1 and thirdLevel_a1.level = :level_p2', Dummy::class)); + $this->assertEquals($actual, $expected); + } }