diff --git a/lib/Doctrine/ORM/QueryBuilder.php b/lib/Doctrine/ORM/QueryBuilder.php index c67506d98..521263495 100644 --- a/lib/Doctrine/ORM/QueryBuilder.php +++ b/lib/Doctrine/ORM/QueryBuilder.php @@ -50,6 +50,7 @@ class QueryBuilder * @var array The array of DQL parts collected. */ private $_dqlParts = array( + 'distinct' => false, 'select' => array(), 'from' => array(), 'join' => array(), @@ -346,7 +347,7 @@ class QueryBuilder * ->setParameters(array( * 'user_id1' => 1, * 'user_id2' => 2 - * )); + )); * * * @param array $params The query parameters to set. @@ -503,6 +504,25 @@ class QueryBuilder return $this->add('select', new Expr\Select($selects), false); } + /** + * Add a DISTINCT flag to this query. + * + * + * $qb = $em->createQueryBuilder() + * ->select('u') + * ->distinct() + * ->from('User', 'u'); + * + * + * @param bool + * @return QueryBuilder + */ + public function distinct($flag = true) + { + $this->_dqlParts['distinct'] = (bool) $flag; + return $this; + } + /** * Adds an item that is to be returned in the query result. * @@ -981,7 +1001,9 @@ class QueryBuilder private function _getDQLForSelect() { - $dql = 'SELECT' . $this->_getReducedDQLQueryPart('select', array('pre' => ' ', 'separator' => ', ')); + $dql = 'SELECT' + . ($this->_dqlParts['distinct']===true ? ' DISTINCT' : '') + . $this->_getReducedDQLQueryPart('select', array('pre' => ' ', 'separator' => ', ')); $fromParts = $this->getDQLPart('from'); $joinParts = $this->getDQLPart('join'); @@ -1090,4 +1112,4 @@ class QueryBuilder } } } -} \ No newline at end of file +} diff --git a/tests/Doctrine/Tests/ORM/QueryBuilderTest.php b/tests/Doctrine/Tests/ORM/QueryBuilderTest.php index 93af68ae6..f078b8995 100644 --- a/tests/Doctrine/Tests/ORM/QueryBuilderTest.php +++ b/tests/Doctrine/Tests/ORM/QueryBuilderTest.php @@ -732,4 +732,17 @@ class QueryBuilderTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $qb->getDQL()); } -} \ No newline at end of file + + /** + * @group DDC-1619 + */ + public function testAddDistinct() + { + $qb = $this->_em->createQueryBuilder() + ->select('u') + ->distinct() + ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u'); + + $this->assertEquals('SELECT DISTINCT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $qb->getDQL()); + } +}