Beispiel #1
0
 /**
  * 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 DoctrineException::notImplemented();
     }
     $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->mappedByFieldName];
         $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 . '.' . $owningAssoc->getQuotedJoinColumnName($sourceColumn, $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) . ' = ?';
         }
     } else {
         // many-to-many
         $targetClass = $this->_em->getClassMetadata($assoc->targetEntityName);
         $owningAssoc = $assoc->isOwningSide ? $assoc : $targetClass->associationMappings[$assoc->mappedByFieldName];
         $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 . '.' . $owningAssoc->getQuotedJoinColumnName($joinColumn['name'], $this->_platform) . ' = ' . $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 . '.' . $owningAssoc->getQuotedJoinColumnName($joinColumn['name'], $this->_platform) . ' = ' . $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 . ')';
 }
Beispiel #2
0
 /**
  * Creates a copy of the given entity. Can create a shallow or a deep copy.
  *
  * @param object $entity  The entity to copy.
  * @return object  The new entity.
  * @todo Implementation or remove.
  */
 public function copy($entity, $deep = false)
 {
     throw DoctrineException::notImplemented();
 }
 public function generate(EntityManager $em, $entity)
 {
     throw \Doctrine\Common\DoctrineException::notImplemented(__CLASS__ . '::' . __FUNCTION__);
 }