Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-2191

Bug in QueryBuilder::add() method, param $append has no effect for where/having DQL parts

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: Git Master
    • Fix Version/s: 2.4
    • 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

        Hide
        Benjamin Eberlei added a comment -

        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.

        Show
        Benjamin Eberlei added a comment - 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.

          People

          • Assignee:
            Benjamin Eberlei
            Reporter:
            Mykola Zyk
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: