/**
  * Creates a left join list for translations
  * on used query components
  *
  * @todo: make it cleaner
  * @return string
  */
 private function prepareTranslatedComponents()
 {
     $em = $this->getEntityManager();
     $ea = new TranslatableEventAdapter();
     $locale = $this->listener->getListenerLocale();
     $defaultLocale = $this->listener->getDefaultLocale();
     foreach ($this->translatedComponents as $dqlAlias => $comp) {
         $meta = $comp['metadata'];
         $config = $this->listener->getConfiguration($em, $meta->name);
         $transClass = $this->listener->getTranslationClass($ea, $meta->name);
         $transMeta = $em->getClassMetadata($transClass);
         $transTable = $transMeta->getQuotedTableName($this->platform);
         if ($locale !== $defaultLocale) {
             foreach ($config['fields'] as $field) {
                 $compTableName = $meta->getQuotedTableName($this->platform);
                 $compTblAlias = $this->getSQLTableAlias($compTableName, $dqlAlias);
                 $tblAlias = $this->getSQLTableAlias('trans' . $compTblAlias . $field);
                 $sql = ' LEFT JOIN ' . $transTable . ' ' . $tblAlias;
                 $sql .= ' ON ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('locale', $this->platform) . ' = ' . $this->conn->quote($locale);
                 $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('objectClass', $this->platform) . ' = ' . $this->conn->quote($meta->name);
                 $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('field', $this->platform) . ' = ' . $this->conn->quote($field);
                 $identifier = $meta->getSingleIdentifierFieldName();
                 $colName = $meta->getQuotedColumnName($identifier, $this->platform);
                 $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('foreignKey', $this->platform) . ' = ' . $compTblAlias . '.' . $colName;
                 isset($this->components[$dqlAlias]) ? $this->components[$dqlAlias] .= $sql : ($this->components[$dqlAlias] = $sql);
                 if ($this->needsFallback()) {
                     // COALESCE with the original record columns
                     $this->replacements[$compTblAlias . '.' . $meta->getQuotedColumnName($field, $this->platform)] = 'COALESCE(' . $tblAlias . '.' . $transMeta->getQuotedColumnName('content', $this->platform) . ', ' . $compTblAlias . '.' . $meta->getQuotedColumnName($field, $this->platform) . ')';
                 } else {
                     $this->replacements[$compTblAlias . '.' . $meta->getQuotedColumnName($field, $this->platform)] = $tblAlias . '.' . $transMeta->getQuotedColumnName('content', $this->platform);
                 }
             }
         }
     }
 }
Example #2
0
    /**
     * Creates a left join list for translations
     * on used query components
     *
     * @todo: make it cleaner
     * @return string
     */
    private function getTranslationJoinsSql()
    {
        $result = array();
        $em = $this->getEntityManager();
        $ea = new TranslatableEventAdapter;
        $locale = $this->listener->getListenerLocale();
        $defaultLocale = $this->listener->getDefaultLocale();

        foreach ($this->translatedComponents as $dqlAlias => $comp) {
            if (!isset($result[$comp['nestingLevel']])) {
                $result[$comp['nestingLevel']] = '';
            }
            $meta = $comp['metadata'];
            $config = $this->listener->getConfiguration($em, $meta->name);
            $transClass = $this->listener->getTranslationClass($ea, $meta->name);
            $transMeta = $em->getClassMetadata($transClass);
            $transTable = $transMeta->getQuotedTableName($this->platform);
            foreach ($config['fields'] as $field) {
                $compTableName = $meta->getQuotedTableName($this->platform);
                $compTblAlias = $this->getSQLTableAlias($compTableName, $dqlAlias);
                $tblAlias = $this->getSQLTableAlias('trans'.$compTblAlias.$field);
                $sql = ' LEFT JOIN '.$transTable.' '.$tblAlias;
                $sql .= ' ON '.$tblAlias.'.'.$transMeta->getQuotedColumnName('locale', $this->platform)
                    .' = '.$this->conn->quote($locale);
                $sql .= ' AND '.$tblAlias.'.'.$transMeta->getQuotedColumnName('objectClass', $this->platform)
                    .' = '.$this->conn->quote($meta->name);
                $sql .= ' AND '.$tblAlias.'.'.$transMeta->getQuotedColumnName('field', $this->platform)
                    .' = '.$this->conn->quote($field);
                $identifier = $meta->getSingleIdentifierFieldName();
                $colName = $meta->getQuotedColumnName($identifier, $this->platform);
                $sql .= ' AND '.$tblAlias.'.'.$transMeta->getQuotedColumnName('foreignKey', $this->platform)
                    .' = '.$compTblAlias.'.'.$colName;
                $result[$comp['nestingLevel']] .= $sql;
                if (strlen($defaultLocale) && $locale != $defaultLocale) {
                    // join default locale
                    $tblAliasDefault = $this->getSQLTableAlias('trans_default_locale'.$compTblAlias.$field);
                    $sql = ' LEFT JOIN '.$transTable.' '.$tblAliasDefault;
                    $sql .= ' ON '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('locale', $this->platform)
                        .' = '.$this->conn->quote($defaultLocale);
                    $sql .= ' AND '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('objectClass', $this->platform)
                        .' = '.$this->conn->quote($meta->name);
                    $sql .= ' AND '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('field', $this->platform)
                        .' = '.$this->conn->quote($field);
                    $sql .= ' AND '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('foreignKey', $this->platform)
                        .' = '.$compTblAlias.'.'.$colName;
                    $result[$comp['nestingLevel']] .= $sql;
                    $this->replacements[$compTblAlias.'.'.$meta->getQuotedColumnName($field, $this->platform)]
                        = 'COALESCE('.$tblAlias.'.'.$transMeta->getQuotedColumnName('content', $this->platform)
                        .', '.$tblAliasDefault.'.'.$transMeta->getQuotedColumnName('content', $this->platform).')'
                    ;
                } else {
                    $this->replacements[$compTblAlias.'.'.$meta->getQuotedColumnName($field, $this->platform)]
                        = $tblAlias.'.'.$transMeta->getQuotedColumnName('content', $this->platform)
                    ;
                }
            }
        }
        return $result;
    }