This commit is contained in:
parent
1133b26c2b
commit
795bb23c2f
@ -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 '
|
||||||
|
Loading…
Reference in New Issue
Block a user