Skip to content

Commit

Permalink
Merge pull request #802 from soyuka/better-filter-join-once
Browse files Browse the repository at this point in the history
eager associations joins are on the same alias in dql
  • Loading branch information
dunglas committed Oct 13, 2016
2 parents 4e43949 + f3e4866 commit c1090d1
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
4 changes: 2 additions & 2 deletions src/Bridge/Doctrine/Orm/Filter/AbstractFilter.php
Expand Up @@ -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;
}
Expand Down
26 changes: 25 additions & 1 deletion tests/Bridge/Doctrine/Orm/Filter/SearchFilterTest.php
Expand Up @@ -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');
Expand All @@ -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);
}
}

0 comments on commit c1090d1

Please sign in to comment.