コード例 #1
0
 /**
  * Walks down an InstanceOfExpression AST node, thereby generating the appropriate SQL.
  *
  * @param InstanceOfExpression
  * @return string The SQL.
  */
 public function walkInstanceOfExpression($instanceOfExpr)
 {
     $sql = '';
     $dqlAlias = $instanceOfExpr->identificationVariable;
     $discrClass = $class = $this->_queryComponents[$dqlAlias]['metadata'];
     $fieldName = null;
     if ($class->discriminatorColumn) {
         $discrClass = $this->_em->getClassMetadata($class->rootEntityName);
     }
     if ($this->_useSqlTableAliases) {
         $sql .= $this->getSQLTableAlias($discrClass->table['name'], $dqlAlias) . '.';
     }
     $sql .= $class->discriminatorColumn['name'] . ($instanceOfExpr->not ? ' <> ' : ' = ');
     if ($instanceOfExpr->value instanceof AST\InputParameter) {
         // We need to modify the parameter value to be its correspondent mapped value
         $dqlParamKey = $instanceOfExpr->value->name;
         $paramValue = $this->_query->getParameter($dqlParamKey);
         if (!$paramValue instanceof \Doctrine\ORM\Mapping\ClassMetadata) {
             throw QueryException::invalidParameterType('ClassMetadata', get_class($paramValue));
         }
         $entityClassName = $paramValue->name;
     } else {
         // Get name from ClassMetadata to resolve aliases.
         $entityClassName = $this->_em->getClassMetadata($instanceOfExpr->value)->name;
     }
     if ($entityClassName == $class->name) {
         $sql .= $this->_conn->quote($class->discriminatorValue);
     } else {
         $discrMap = array_flip($class->discriminatorMap);
         $sql .= $this->_conn->quote($discrMap[$entityClassName]);
     }
     return $sql;
 }
コード例 #2
0
ファイル: SqlWalker.php プロジェクト: bardascat/blogify
 /**
  * Walks down a SubselectFromClause AST node, thereby generating the appropriate SQL.
  *
  * @param SubselectFromClause
  * @return string The SQL.
  */
 public function walkSubselectFromClause($subselectFromClause)
 {
     $identificationVarDecls = $subselectFromClause->identificationVariableDeclarations;
     $sqlParts = array();
     foreach ($identificationVarDecls as $subselectIdVarDecl) {
         $sql = $this->platform->appendLockHint($this->walkRangeVariableDeclaration($subselectIdVarDecl->rangeVariableDeclaration), $this->query->getHint(Query::HINT_LOCK_MODE));
         foreach ($subselectIdVarDecl->joins as $join) {
             $sql .= $this->walkJoin($join);
         }
         $sqlParts[] = $sql;
     }
     return ' FROM ' . implode(', ', $sqlParts);
 }
コード例 #3
0
ファイル: SqlWalker.php プロジェクト: TeamA-ict/TeamA
 /**
  * Walks down an InstanceOfExpression AST node, thereby generating the appropriate SQL.
  *
  * @param InstanceOfExpression
  * @return string The SQL.
  */
 public function walkInstanceOfExpression($instanceOfExpr)
 {
     $sql = '';
     $dqlAlias = $instanceOfExpr->identificationVariable;
     $discrClass = $class = $this->queryComponents[$dqlAlias]['metadata'];
     if ($class->discriminatorColumn) {
         $discrClass = $this->em->getClassMetadata($class->rootEntityName);
     }
     if ($this->useSqlTableAliases) {
         $sql .= $this->getSQLTableAlias($discrClass->getTableName(), $dqlAlias) . '.';
     }
     $sql .= $class->discriminatorColumn['name'] . ($instanceOfExpr->not ? ' NOT IN ' : ' IN ');
     $sqlParameterList = array();
     foreach ($instanceOfExpr->value as $parameter) {
         if ($parameter instanceof AST\InputParameter) {
             // We need to modify the parameter value to be its correspondent mapped value
             $dqlParamKey = $parameter->name;
             $dqlParam = $this->query->getParameter($dqlParamKey);
             $paramValue = $this->query->processParameterValue($dqlParam->getValue());
             if (!$paramValue instanceof \Doctrine\ORM\Mapping\ClassMetadata) {
                 throw QueryException::invalidParameterType('ClassMetadata', get_class($paramValue));
             }
             $entityClassName = $paramValue->name;
         } else {
             // Get name from ClassMetadata to resolve aliases.
             $entityClassName = $this->em->getClassMetadata($parameter)->name;
         }
         if ($entityClassName == $class->name) {
             $sqlParameterList[] = $this->conn->quote($class->discriminatorValue);
         } else {
             $discrMap = array_flip($class->discriminatorMap);
             if (!isset($discrMap[$entityClassName])) {
                 throw QueryException::instanceOfUnrelatedClass($entityClassName, $class->rootEntityName);
             }
             $sqlParameterList[] = $this->conn->quote($discrMap[$entityClassName]);
         }
     }
     $sql .= '(' . implode(', ', $sqlParameterList) . ')';
     return $sql;
 }
コード例 #4
0
ファイル: SqlWalker.php プロジェクト: andreia/doctrine
 /**
  * Walks down a CollectionMemberExpression AST node, thereby generating the appropriate SQL.
  *
  * @param CollectionMemberExpression
  * @return string The SQL.
  */
 public function walkCollectionMemberExpression($collMemberExpr)
 {
     $sql = $collMemberExpr->not ? 'NOT ' : '';
     $sql .= 'EXISTS (SELECT 1 FROM ';
     $entityExpr = $collMemberExpr->entityExpression;
     $collPathExpr = $collMemberExpr->collectionValuedPathExpression;
     $parts = $collPathExpr->parts;
     $fieldName = array_pop($parts);
     $dqlAlias = $collPathExpr->identificationVariable . (!empty($parts) ? '.' . implode('.', $parts) : '');
     $class = $this->_queryComponents[$dqlAlias]['metadata'];
     if ($entityExpr instanceof AST\InputParameter) {
         $dqlParamKey = $entityExpr->name;
         $entity = $this->_query->getParameter($dqlParamKey);
     } else {
         //TODO
         throw new \BadMethodCallException("Not implemented");
     }
     $assoc = $class->associationMappings[$fieldName];
     if ($assoc->isOneToMany()) {
         $targetClass = $this->_em->getClassMetadata($assoc->targetEntityName);
         $targetTableAlias = $this->getSqlTableAlias($targetClass->primaryTable['name']);
         $sourceTableAlias = $this->getSqlTableAlias($class->primaryTable['name'], $dqlAlias);
         $sql .= $targetClass->getQuotedTableName($this->_platform) . ' ' . $targetTableAlias . ' WHERE ';
         $owningAssoc = $targetClass->associationMappings[$assoc->mappedBy];
         $first = true;
         foreach ($owningAssoc->targetToSourceKeyColumns as $targetColumn => $sourceColumn) {
             if ($first) {
                 $first = false;
             } else {
                 $sql .= ' AND ';
             }
             $sql .= $sourceTableAlias . '.' . $class->getQuotedColumnName($class->fieldNames[$targetColumn], $this->_platform) . ' = ' . $targetTableAlias . '.' . $sourceColumn;
         }
         $sql .= ' AND ';
         $first = true;
         foreach ($targetClass->identifier as $idField) {
             if ($first) {
                 $first = false;
             } else {
                 $sql .= ' AND ';
             }
             $this->_parserResult->addParameterMapping($dqlParamKey, $this->_sqlParamIndex++);
             $sql .= $targetTableAlias . '.' . $targetClass->getQuotedColumnName($idField, $this->_platform) . ' = ?';
         }
     } else {
         // many-to-many
         $targetClass = $this->_em->getClassMetadata($assoc->targetEntityName);
         $owningAssoc = $assoc->isOwningSide ? $assoc : $targetClass->associationMappings[$assoc->mappedBy];
         $joinTable = $assoc->isOwningSide ? $assoc->joinTable : $owningAssoc->joinTable;
         // SQL table aliases
         $joinTableAlias = $this->getSqlTableAlias($joinTable['name']);
         $targetTableAlias = $this->getSqlTableAlias($targetClass->primaryTable['name']);
         $sourceTableAlias = $this->getSqlTableAlias($class->primaryTable['name'], $dqlAlias);
         // join to target table
         $sql .= $assoc->getQuotedJoinTableName($this->_platform) . ' ' . $joinTableAlias . ' INNER JOIN ' . $targetClass->getQuotedTableName($this->_platform) . ' ' . $targetTableAlias . ' ON ';
         // join conditions
         $joinColumns = $assoc->isOwningSide ? $joinTable['joinColumns'] : $joinTable['inverseJoinColumns'];
         $referencedColumnClass = $assoc->isOwningSide ? $class : $targetClass;
         $first = true;
         foreach ($joinColumns as $joinColumn) {
             if ($first) {
                 $first = false;
             } else {
                 $sql .= ' AND ';
             }
             $sql .= $joinTableAlias . '.' . $joinColumn['name'] . ' = ' . $sourceTableAlias . '.' . $referencedColumnClass->getQuotedColumnName($referencedColumnClass->fieldNames[$joinColumn['referencedColumnName']], $this->_platform);
         }
         $sql .= ' WHERE ';
         $joinColumns = $assoc->isOwningSide ? $joinTable['inverseJoinColumns'] : $joinTable['joinColumns'];
         $first = true;
         foreach ($joinColumns as $joinColumn) {
             if ($first) {
                 $first = false;
             } else {
                 $sql .= ' AND ';
             }
             $sql .= $joinTableAlias . '.' . $joinColumn['name'] . ' = ' . $targetTableAlias . '.' . $referencedColumnClass->getQuotedColumnName($referencedColumnClass->fieldNames[$joinColumn['referencedColumnName']], $this->_platform);
         }
         $sql .= ' AND ';
         $first = true;
         foreach ($targetClass->identifier as $idField) {
             if ($first) {
                 $first = false;
             } else {
                 $sql .= ' AND ';
             }
             $this->_parserResult->addParameterMapping($dqlParamKey, $this->_sqlParamIndex++);
             $sql .= $targetTableAlias . '.' . $targetClass->getQuotedColumnName($idField, $this->_platform) . ' = ?';
         }
     }
     return $sql . ')';
 }
コード例 #5
0
ファイル: Query.php プロジェクト: andreia/doctrine
 /**
  * {@inheritdoc}
  */
 public function setHydrationMode($hydrationMode)
 {
     $this->_state = self::STATE_DIRTY;
     return parent::setHydrationMode($hydrationMode);
 }
コード例 #6
0
ファイル: NativeQuery.php プロジェクト: andreia/doctrine
 /**
  * Initializes a new instance of the <tt>NativeQuery</tt> class that is bound
  * to the given EntityManager.
  *
  * @param EntityManager $em The EntityManager to use.
  */
 public function __construct(EntityManager $em)
 {
     parent::__construct($em);
 }