Преглед на файлове

Fix multiple entity join filtering.

Romain Geissler преди 13 години
родител
ревизия
f3382cb0df
променени са 4 файла, в които са добавени 26 реда и са изтрити 17 реда
  1. 2 2
      Builder/DatagridBuilder.php
  2. 21 0
      Datagrid/ProxyQuery.php
  3. 1 9
      Filter/Filter.php
  4. 2 6
      Filter/ModelFilter.php

+ 2 - 2
Builder/DatagridBuilder.php

@@ -60,12 +60,12 @@ class DatagridBuilder implements DatagridBuilderInterface
 
 
             // set the default field mapping
             // set the default field mapping
             if (isset($metadata->fieldMappings[$lastPropertyName])) {
             if (isset($metadata->fieldMappings[$lastPropertyName])) {
-                $fieldDescription->setFieldMapping($metadata->fieldMappings[$lastPropertyName]);
+                $fieldDescription->setOption('field_mapping', $fieldDescription->getOption('field_mapping', $metadata->fieldMappings[$lastPropertyName]));
             }
             }
 
 
             // set the default association mapping
             // set the default association mapping
             if (isset($metadata->associationMappings[$lastPropertyName])) {
             if (isset($metadata->associationMappings[$lastPropertyName])) {
-                $fieldDescription->setAssociationMapping($metadata->associationMappings[$lastPropertyName]);
+                $fieldDescription->setOption('association_mapping', $fieldDescription->getOption('association_mapping', $metadata->associationMappings[$lastPropertyName]));
             }
             }
 
 
             $fieldDescription->setOption('parent_association_mappings', $fieldDescription->getOption('parent_association_mappings', $parentAssociationMappings));
             $fieldDescription->setOption('parent_association_mappings', $fieldDescription->getOption('parent_association_mappings', $parentAssociationMappings));

+ 21 - 0
Datagrid/ProxyQuery.php

@@ -27,10 +27,13 @@ class ProxyQuery implements ProxyQueryInterface
 
 
     protected $parameterUniqueId;
     protected $parameterUniqueId;
 
 
+    protected $entityJoinAliases;
+
     public function __construct(QueryBuilder $queryBuilder)
     public function __construct(QueryBuilder $queryBuilder)
     {
     {
         $this->queryBuilder = $queryBuilder;
         $this->queryBuilder = $queryBuilder;
         $this->uniqueParameterId = 0;
         $this->uniqueParameterId = 0;
+        $this->entityJoinAliases = array();
     }
     }
 
 
     public function execute(array $params = array(), $hydrationMode = null)
     public function execute(array $params = array(), $hydrationMode = null)
@@ -171,4 +174,22 @@ class ProxyQuery implements ProxyQueryInterface
     {
     {
         return $this->uniqueParameterId++;
         return $this->uniqueParameterId++;
     }
     }
+
+    public function entityJoin($associationMappings)
+    {
+        $alias = $this->queryBuilder->getRootAlias();
+        $newAlias = 's';
+
+        foreach($associationMappings as $associationMapping){
+            $newAlias .= '_'.$associationMapping['fieldName'];
+            if (!in_array($newAlias, $this->entityJoinAliases)) {
+                $this->entityJoinAliases[] = $newAlias;
+                $this->queryBuilder->leftJoin(sprintf('%s.%s', $alias, $associationMapping['fieldName']), $newAlias);
+            }
+
+            $alias = $newAlias;
+        }
+
+        return $alias;
+    }
 }
 }

+ 1 - 9
Filter/Filter.php

@@ -28,15 +28,7 @@ abstract class Filter extends BaseFilter
 
 
     protected function association($queryBuilder, $value)
     protected function association($queryBuilder, $value)
     {
     {
-        $parentAssociationMappings = $this->getParentAssociationMappings();
-        $alias = $this->getOption('alias', $queryBuilder->getRootAlias());
-        $newAlias = 's_'.$alias;
-
-        foreach($parentAssociationMappings as $parentAssociationMapping){
-            $newAlias .= '_'.$parentAssociationMapping['fieldName'];
-            $queryBuilder->leftJoin(sprintf('%s.%s', $alias, $parentAssociationMapping['fieldName']), $newAlias);
-            $alias = $newAlias;
-        }
+        $alias = $queryBuilder->entityJoin($this->getParentAssociationMappings());
 
 
         return array($alias, $this->getFieldName());
         return array($alias, $this->getFieldName());
     }
     }

+ 2 - 6
Filter/ModelFilter.php

@@ -73,8 +73,6 @@ class ModelFilter extends Filter
 
 
     protected function association($queryBuilder, $data)
     protected function association($queryBuilder, $data)
     {
     {
-        list($alias, $field) = parent::association($queryBuilder, $data);
-
         $types = array(
         $types = array(
             ClassMetadataInfo::ONE_TO_ONE,
             ClassMetadataInfo::ONE_TO_ONE,
             ClassMetadataInfo::ONE_TO_MANY,
             ClassMetadataInfo::ONE_TO_MANY,
@@ -86,11 +84,9 @@ class ModelFilter extends Filter
             throw new \RunTimeException('Invalid mapping type');
             throw new \RunTimeException('Invalid mapping type');
         }
         }
 
 
-        $newAlias = $alias.'_'.$field;
-
-        $queryBuilder->leftJoin(sprintf('%s.%s', $alias, $field), $newAlias);
+        $alias = $queryBuilder->entityJoin($this->getParentAssociationMappings() + array($this->getAssociationMapping()));
 
 
-        return array($newAlias, false);
+        return array($alias, false);
     }
     }
 
 
     public function getDefaultOptions()
     public function getDefaultOptions()