Details
-
Type:
Bug
-
Status:
Resolved
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: Git Master
-
Fix Version/s: None
-
Component/s: ORM
-
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
526 line of Doctrine/ORM/QueryBuilder.php, part of body add() method:
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.
Activity
Benjamin Eberlei
made changes -
| Field | Original Value | New Value |
|---|---|---|
| Status | Open [ 1 ] | Resolved [ 5 ] |
| Resolution | Fixed [ 1 ] |
This list may be incomplete, as errors occurred whilst retrieving source from linked applications:
- Request to http://www.doctrine-project.org/fisheye/ failed: Error in remote call to 'FishEye 0 (http://www.doctrine-project.org/fisheye/)' (http://www.doctrine-project.org/fisheye) [AbstractRestCommand{path='/rest-service-fe/search-v1/crossRepositoryQuery', params={query=DDC-2191, expand=changesets[-21:-1].revisions[0:29],reviews}, methodType=GET}] : Received status code 503 (Service Temporarily Unavailable)
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.