Skip to content

Commit

Permalink
Do not add left join to already joined entities with custom query
Browse files Browse the repository at this point in the history
  • Loading branch information
pulzarraider committed Apr 19, 2015
1 parent 802a70b commit 1d44665
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 7 deletions.
29 changes: 23 additions & 6 deletions Datagrid/ProxyQuery.php
Expand Up @@ -51,11 +51,11 @@ public function execute(array $params = array(), $hydrationMode = null)
if ($this->getSortBy()) {
$sortBy = $this->getSortBy();
if (strpos($sortBy, '.') === false) { // add the current alias
$sortBy = $queryBuilder->getRootAlias() . '.' . $sortBy;
$sortBy = $queryBuilder->getRootAlias().'.'.$sortBy;
}
$queryBuilder->addOrderBy($sortBy, $this->getSortOrder());
} else {
$queryBuilder->resetDQLPart( 'orderBy' );
$queryBuilder->resetDQLPart('orderBy');
}

return $this->getFixedQueryBuilder($queryBuilder)->getQuery()->execute($params, $hydrationMode);
Expand Down Expand Up @@ -83,7 +83,7 @@ private function getFixedQueryBuilder(QueryBuilder $queryBuilder)
// step 3 : retrieve the different subjects id
$select = sprintf('%s.%s', $queryBuilderId->getRootAlias(), $idName);
$queryBuilderId->resetDQLPart('select');
$queryBuilderId->add('select', 'DISTINCT ' . $select);
$queryBuilderId->add('select', 'DISTINCT '.$select);

// for SELECT DISTINCT, ORDER BY expressions must appear in select list
/* Consider
Expand All @@ -95,7 +95,7 @@ private function getFixedQueryBuilder(QueryBuilder $queryBuilder)
if ($this->getSortBy()) {
$sortBy = $this->getSortBy();
if (strpos($sortBy, '.') === false) { // add the current alias
$sortBy = $queryBuilderId->getRootAlias() . '.' . $sortBy;
$sortBy = $queryBuilderId->getRootAlias().'.'.$sortBy;
}
$sortBy .= ' AS __order_by';
$queryBuilderId->addSelect($sortBy);
Expand Down Expand Up @@ -140,7 +140,7 @@ public function __get($name)
public function setSortBy($parentAssociationMappings, $fieldMapping)
{
$alias = $this->entityJoin($parentAssociationMappings);
$this->sortBy = $alias . '.' . $fieldMapping['fieldName'];
$this->sortBy = $alias.'.'.$fieldMapping['fieldName'];

return $this;
}
Expand Down Expand Up @@ -250,8 +250,25 @@ public function entityJoin(array $associationMappings)

$newAlias = 's';

$joinedEntities = $this->queryBuilder->getDQLPart('join');

foreach ($associationMappings as $associationMapping) {
$newAlias .= '_' . $associationMapping['fieldName'];

// Do not add left join to already joined entities with custom query
foreach ($joinedEntities as $joinExprList) {
foreach ($joinExprList as $joinExpr) {
$newAliasTmp = $joinExpr->getAlias();

if (sprintf('%s.%s', $alias, $associationMapping['fieldName']) === $joinExpr->getJoin()) {
$this->entityJoinAliases[] = $newAliasTmp;
$alias = $newAliasTmp;

continue 3;
}
}
}

$newAlias .= '_'.$associationMapping['fieldName'];
if (!in_array($newAlias, $this->entityJoinAliases)) {
$this->entityJoinAliases[] = $newAlias;
$this->queryBuilder->leftJoin(sprintf('%s.%s', $alias, $associationMapping['fieldName']), $newAlias);
Expand Down
6 changes: 5 additions & 1 deletion Tests/Filter/QueryBuilder.php
Expand Up @@ -11,7 +11,6 @@

namespace Sonata\DoctrineORMAdminBundle\Tests\Filter;

use Sonata\DoctrineORMAdminBundle\Filter\Filter;

class QueryBuilder
{
Expand Down Expand Up @@ -60,6 +59,11 @@ public function in($name, $value)
return sprintf('%s IN %s', 'in_'.$name, $value);
}

public function getDQLPart($queryPart)
{
return array();
}

/**
* @return string
*/
Expand Down

0 comments on commit 1d44665

Please sign in to comment.