/** * 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(); 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); $colAlias = $this->getSQLColumnAlias($colName); $sql .= ' AND ' . $tblAlias . '.' . $transMeta->getQuotedColumnName('foreignKey', $this->platform) . ' = ' . $compTblAlias . '.' . $colName; $result[$comp['nestingLevel']] .= $sql; $this->replacements[$compTblAlias . '.' . $meta->getQuotedColumnName($field, $this->platform)] = $tblAlias . '.' . $transMeta->getQuotedColumnName('content', $this->platform); } } return $result; }
/** * 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); } } } } }