1
0
mirror of synced 2024-12-13 14:56:01 +03:00
This commit is contained in:
zYne 2007-08-09 17:25:07 +00:00
parent 1133b26c2b
commit 795bb23c2f

View File

@ -460,11 +460,13 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
* parseClause * parseClause
* parses given DQL clause * parses given DQL clause
* *
* this method handles three tasks: * this method handles five tasks:
* *
* 1. Converts all DQL functions to their native SQL equivalents * 1. Converts all DQL functions to their native SQL equivalents
* 2. Converts all component references to their table alias equivalents * 2. Converts all component references to their table alias equivalents
* 3. Quotes all identifiers * 3. Converts all column aliases to actual column names
* 4. Quotes all identifiers
* 5. Parses nested clauses and subqueries recursively
* *
* @return string SQL string * @return string SQL string
*/ */
@ -496,7 +498,18 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
} }
$term[0] = $expr; $term[0] = $expr;
} else { } else {
$term[0] = '(' . Doctrine_Tokenizer::bracketTrim($term[0]) . ')'; $trimmed = trim(Doctrine_Tokenizer::bracketTrim($term[0]));
// check for possible subqueries
if (substr($trimmed, 0, 4) == 'FROM' || substr($trimmed, 0, 6) == 'SELECT') {
// parse subquery
$trimmed = $this->createSubquery()->parseQuery($trimmed)->getQuery();
} else {
// parse normal clause
$trimmed = $this->parseClause($trimmed);
}
$term[0] = '(' . $trimmed . ')';
} }
} else { } else {
if (substr($term[0], 0, 1) !== "'" && substr($term[0], -1) !== "'") { if (substr($term[0], 0, 1) !== "'" && substr($term[0], -1) !== "'") {
@ -513,7 +526,8 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
} }
$table = $this->_aliasMap[$componentAlias]['table']; $table = $this->_aliasMap[$componentAlias]['table'];
// get the actual field name from alias
$field = $table->getColumnName($field); $field = $table->getColumnName($field);
// check column existence // check column existence
@ -524,7 +538,6 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
$tableAlias = $this->getTableAlias($componentAlias); $tableAlias = $this->getTableAlias($componentAlias);
// build sql expression // build sql expression
$term[0] = $this->_conn->quoteIdentifier($tableAlias) $term[0] = $this->_conn->quoteIdentifier($tableAlias)
. '.' . '.'
. $this->_conn->quoteIdentifier($field); . $this->_conn->quoteIdentifier($field);
@ -1292,7 +1305,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
} }
if ($relation instanceof Doctrine_Relation_Association) { if ($relation instanceof Doctrine_Relation_Association) {
$asf = $relation->getAssociationFactory(); $asf = $relation->getAssociationTable();
$assocTableName = $asf->getTableName(); $assocTableName = $asf->getTableName();
@ -1305,11 +1318,10 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
$assocAlias = $this->getTableAlias($assocPath, $asf->getTableName()); $assocAlias = $this->getTableAlias($assocPath, $asf->getTableName());
$queryPart = $join . $assocTableName . ' ' . $assocAlias; $queryPart = $join . $assocTableName . ' ' . $assocAlias;
$queryPart .= ' ON ' . $localAlias $queryPart .= ' ON ' . $localAlias
. '.' . '.'
. $table->getIdentifier() . $table->getColumnName($table->getIdentifier())
. ' = ' . ' = '
. $assocAlias . '.' . $relation->getLocal(); . $assocAlias . '.' . $relation->getLocal();
@ -1317,7 +1329,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
// equal nest relation needs additional condition // equal nest relation needs additional condition
$queryPart .= ' OR ' . $localAlias $queryPart .= ' OR ' . $localAlias
. '.' . '.'
. $table->getIdentifier() . $table->getColumnName($table->getIdentifier())
. ' = ' . ' = '
. $assocAlias . '.' . $relation->getForeign(); . $assocAlias . '.' . $relation->getForeign();
@ -1340,7 +1352,7 @@ class Doctrine_Query extends Doctrine_Query_Abstract implements Countable
if ($relation->isEqual()) { if ($relation->isEqual()) {
$queryPart .= ' OR ' $queryPart .= ' OR '
. $this->_conn->quoteIdentifier($foreignAlias . '.' . $table->getIdentifier()) . $this->_conn->quoteIdentifier($foreignAlias . '.' . $table->getColumnName($table->getIdentifier()))
. ' = ' . ' = '
. $this->_conn->quoteIdentifier($assocAlias . '.' . $relation->getLocal()) . $this->_conn->quoteIdentifier($assocAlias . '.' . $relation->getLocal())
. ') AND ' . ') AND '