コード例 #1
0
 protected function addUnionStatement(&$className, &$tableName, &$propertyPath, array &$sql)
 {
     $explodedPropertyPath = explode('.', $propertyPath, 2);
     $propertyName = $explodedPropertyPath[0];
     $columnName = $this->dataMapper->convertPropertyNameToColumnName($propertyName, $className);
     $tableName = $this->dataMapper->convertClassNameToTableName($className);
     $columnMap = $this->dataMapper->getDataMap($className)->getColumnMap($propertyName);
     $parentKeyFieldName = $columnMap->getParentKeyFieldName();
     $childTableName = $columnMap->getChildTableName();
     if ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_ONE) {
         if (isset($parentKeyFieldName)) {
             $sql['unions'][$childTableName] = 'LEFT JOIN ' . $childTableName . ' ON ' . $tableName . '.uid=' . $childTableName . '.' . $parentKeyFieldName;
         } else {
             $sql['unions'][$childTableName] = 'LEFT JOIN ' . $childTableName . ' ON ' . $tableName . '.' . $columnName . '=' . $childTableName . '.uid';
         }
         $className = $this->dataMapper->getType($className, $propertyName);
     } elseif ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_MANY) {
         if (isset($parentKeyFieldName)) {
             $sql['unions'][$childTableName] = 'LEFT JOIN ' . $childTableName . ' ON ' . $tableName . '.uid=' . $childTableName . '.' . $parentKeyFieldName;
         } else {
             $onStatement = '(' . $tableName . '.' . $columnName . ' LIKE CONCAT(\'%,\',' . $childTableName . '.uid,\',%\')';
             $onStatement .= ' OR ' . $tableName . '.' . $columnName . ' LIKE CONCAT(\'%,\',' . $childTableName . '.uid)';
             $onStatement .= ' OR ' . $tableName . '.' . $columnName . ' LIKE CONCAT(' . $childTableName . '.uid,\',%\'))';
             $sql['unions'][$childTableName] = 'LEFT JOIN ' . $childTableName . ' ON ' . $onStatement;
         }
         $className = $this->dataMapper->getType($className, $propertyName);
     } elseif ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_AND_BELONGS_TO_MANY) {
         $relationTableName = $columnMap->getRelationTableName();
         $sql['unions'][$relationTableName] = 'LEFT JOIN ' . $relationTableName . ' ON ' . $tableName . '.uid=' . $relationTableName . '.uid_local';
         $sql['unions'][$childTableName] = 'LEFT JOIN ' . $childTableName . ' ON ' . $relationTableName . '.uid_foreign=' . $childTableName . '.uid';
         $className = $this->dataMapper->getType($className, $propertyName);
     } else {
         throw new Tx_Extbase_Persistence_Exception('Could not determine type of relation.', 1252502725);
     }
     // TODO check if there is another solution for this
     $sql['keywords']['distinct'] = 'DISTINCT';
     $propertyPath = $explodedPropertyPath[1];
     $tableName = $childTableName;
 }