[DDC-2191] Bug in QueryBuilder::add() method, param $append has no effect for where/having DQL parts Created: 07/Dec/12 Updated: 06/Jan/13 Resolved: 06/Jan/13 |
|
| Status: | Resolved |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Type: | Bug | Priority: | Major |
| Reporter: | Mykola Zyk | Assignee: | Benjamin Eberlei |
| Resolution: | Fixed | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Now $append param of QueryBuilder::add() method has no effect for where and having parts. In example:
$query->add('where', 'u.some = ?1');
$query->add('where', 'u.other = ?2', true);
will result in the loss of condition u.some = ?1 Explanation in code
if ($append && $isMultiple) {
if (is_array($dqlPart)) {
$key = key($dqlPart);
$this->_dqlParts[$dqlPartName][$key][] = $dqlPart[$key];
} else {
$this->_dqlParts[$dqlPartName][] = $dqlPart;
}
} else {
$this->_dqlParts[$dqlPartName] = ($isMultiple) ? array($dqlPart) : $dqlPart;
}
According to the code above $append parameter is checked in conjunction with $isMultiple variable, which is: $isMultiple = is_array($this->_dqlParts[$dqlPartName]); But in 56 line of this file, class property _dqlParts keys where and having are equal null:
private $_dqlParts = array(
'distinct' => false,
'select' => array(),
'from' => array(),
'join' => array(),
'set' => array(),
'where' => null,
'groupBy' => array(),
'having' => null,
'orderBy' => array()
);
As a result, for the parts where and having condition $append && $isMultiple will never be true, regardless of $append value. I can offer a patch on Github to fix this bug, if necessary. |
| Comments |
| Comment by Benjamin Eberlei [ 06/Jan/13 ] |
|
This was and will never be allowed, i introduced an exception to show a way out, you need to look at QueryBuilder#andWhere for example to see a solution to append to where clauses. |