示例#1
0
 /**
  * Strips the key parts and creates a join if it does not exist yet.
  *
  * @param string $key
  */
 protected function shouldJoin($key)
 {
     $parts = explode('.', $key);
     if (!in_array($parts[0], $this->qb->getAllAliases())) {
         $this->qb->leftJoin($this->getRootAlias() . '.' . $parts[0], $parts[0]);
     }
 }
示例#2
0
 /**
  * @param QueryBuilder $qb
  * @param string       $attribute
  * @param string       $aliasJoin
  */
 protected function safeLeftJoin(QueryBuilder $qb, string $attribute, string $aliasJoin)
 {
     $aliases = $qb->getAllAliases();
     if (!in_array($aliasJoin, $aliases)) {
         $alias = $this->getAlias($qb);
         $qb->leftJoin($alias . $attribute, $aliasJoin);
     }
 }
示例#3
0
 /**
  * @param string $field
  * @param mixed $value
  * @return array
  */
 protected function setQueryParam($field)
 {
     $index = 0;
     $rootAlias = $this->qb->getRootAliases()[$index];
     if (false !== strpos($field, '.')) {
         list($assoc, $subField) = explode('.', $field);
     } else {
         $assoc = $field;
     }
     $meta = $this->getClassMetadata($index);
     if ($meta->hasAssociation($assoc)) {
         $targetClass = $meta->getAssociationTargetClass($assoc);
         if ($meta->isCollectionValuedAssociation($assoc)) {
             $alias = "{$rootAlias}_{$assoc}";
             if (!in_array($alias, $this->qb->getAllAliases())) {
                 $this->qb->leftJoin("{$rootAlias}.{$assoc}", $alias);
             }
             $assoc = $alias;
         } else {
             $alias = "{$rootAlias}_{$assoc}";
             if (!in_array($alias, $this->qb->getAllAliases())) {
                 $this->qb->join("{$rootAlias}.{$assoc}", $alias);
             }
             $assoc = $alias;
         }
         $em = $this->qb->getEntityManager();
         $targetMeta = $em->getClassMetadata($targetClass);
         if (isset($subField) && !$targetMeta->hasField($subField) && $targetMeta->isInheritanceTypeJoined()) {
             foreach ($targetMeta->discriminatorMap as $alias => $class) {
                 $joinedMeta = $em->getClassMetadata($class);
                 if ($joinedMeta->hasField($subField)) {
                     if (!in_array($alias, $this->qb->getAllAliases())) {
                         $this->qb->leftJoin($joinedMeta->getName(), $alias, 'WITH', "{$alias}.id = {$assoc}.id");
                     }
                     $assoc = $alias;
                 }
             }
         }
         $alias = isset($subField) ? "{$assoc}.{$subField}" : $assoc;
     } else {
         $alias = "{$rootAlias}.{$field}";
     }
     $values = array_slice(func_get_args(), 1);
     if ($values) {
         $result = [$alias];
         foreach ($values as $value) {
             $paramName = $this->getParamName($field);
             $this->qb->setParameter($paramName, $value);
             $result[] = ":{$paramName}";
         }
         return $result;
     }
     return $alias;
 }
 /**
  * {@inheritdoc}
  *
  * @throws InvalidArgumentException When a comparison expression is not supported.
  */
 public function visitComparison(Expr\Comparison $comparison)
 {
     $property = $comparison->getProperty();
     $path = explode('.', $property->getPath());
     $expr = $this->builder->expr();
     $aliases = $this->builder->getAllAliases();
     $prefix = reset($aliases);
     foreach (array_slice($path, 0, -1) as $alias) {
         if (!in_array($alias, $aliases)) {
             $this->builder->join(sprintf('%s.%s', $prefix, $alias), $alias);
         }
         $prefix = $alias;
     }
     $field = sprintf('%s.%s', $prefix, end($path));
     $value = $comparison->getValue();
     switch (true) {
         case $comparison instanceof Expr\IdenticalTo:
         case $comparison instanceof Expr\EqualTo:
             return $expr->eq($field, $expr->literal($value));
         case $comparison instanceof Expr\NotIdenticalTo:
         case $comparison instanceof Expr\NotEqualTo:
             return $expr->neq($field, $expr->literal($value));
         case $comparison instanceof Expr\LessThan:
             return $expr->lt($field, $expr->literal($value));
         case $comparison instanceof Expr\LessThanOrEqualTo:
             return $expr->lte($field, $expr->literal($value));
         case $comparison instanceof Expr\GreaterThan:
             return $expr->gt($field, $expr->literal($value));
         case $comparison instanceof Expr\GreaterThanOrEqualTo:
             return $expr->gte($field, $expr->literal($value));
         case $comparison instanceof Expr\In:
             return $expr->in($field, $expr->literal($value));
         case $comparison instanceof Expr\NotIn:
             return $expr->notIn($field, $expr->literal($value));
         case $comparison instanceof Expr\Contains:
             return $expr->like(sprintf('LOWER(%s)', $field), $expr->literal('%' . strtolower($value) . '%'));
     }
     throw new InvalidArgumentException(sprintf('Unsupported comparison operator "%s".', get_class($comparison)));
 }
示例#5
0
 /**
  * {@inheritdoc}
  */
 public function getAliases()
 {
     return $this->queryBuilder->getAllAliases();
 }
示例#6
0
 /**
  * @param QueryBuilder $queryBuilder
  * @param string $name
  * @return string
  */
 public function getJoinColumnAlias(QueryBuilder &$queryBuilder, $name)
 {
     $alias = $queryBuilder->getRootAliases()[0];
     $allAliases = $queryBuilder->getAllAliases();
     $joinParts = explode('.', $name);
     while (count($joinParts) > 1) {
         $joinName = array_shift($joinParts);
         $joinAlias = $alias . '_' . $joinName;
         if (!in_array($joinAlias, $allAliases)) {
             $queryBuilder->leftJoin($alias . '.' . $joinName, $joinAlias);
             $allAliases[] = $joinAlias;
         }
         $alias = $joinAlias;
     }
     return $alias . '.' . current($joinParts);
 }