[DDC-2313] Deep clone for DBAL QueryBuilder Created: 21/Feb/13  Updated: 18/Jun/13  Resolved: 18/Jun/13

Status: Resolved
Project: Doctrine 2 - ORM
Component/s: DQL
Affects Version/s: 2.2
Fix Version/s: 2.4
Security Level: All

Type: Improvement Priority: Major
Reporter: Tim Mundt Assignee: Benjamin Eberlei
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
is duplicated by DBAL-537 [GH-330] Cloning Resolved


This is basically a duplicate of another issue I stumbled across lately but cannot find here again. It added a __clone() function to the ORM QueryBuilder to allow this use case:
Create a base query and derive two different queries from it.

I adopted the code for the DBAL QueryBuilder which is suffering the same issue (e.g. expressions were not cloned but shared between instances). The code is tested at least for my limited use case.

     * Deep clone of all expression objects in the SQL parts.
     * @return void
    public function __clone()
        foreach ($this->sqlParts as $part => $elements) {
            if (is_array($this->sqlParts[$part])) {
                foreach ($this->sqlParts[$part] as $idx => $element) {
                    if (is_object($element)) {
                        $this->sqlParts[$part][$idx] = clone $element;
            } else if (is_object($elements)) {
                $this->sqlParts[$part] = clone $elements;

        $params = array();

        foreach ($this->params as $param) {
            $params[] = clone $param;

        $this->params = $params;

Comment by Tim Mundt [ 03/Jun/13 ]

Thanks for adding the code tags. Just updated my doctrine to 2.4-RC1 and did not find this in there. Would be nice to see this in the new version. Any obstacles I could be of help with?

Comment by Marco Pivetta [ 03/Jun/13 ]

Tim Mundt, there's an open PR at https://github.com/doctrine/dbal/pull/327

Comment by Benjamin Eberlei [ 18/Jun/13 ]

Fixed in 2.4

Generated at Tue Nov 24 21:28:29 EST 2015 using JIRA 6.4.10#64025-sha1:5b8b74079161cd76a20ab66dda52747ee6701bd6.