Commit cc09204a authored by Benjamin Eberlei's avatar Benjamin Eberlei

Merge branch 'DBAL-172' into 2.1.x

parents 7df036a6 fa092140
...@@ -24,10 +24,10 @@ use Doctrine\DBAL\Query\Expression\CompositeExpression, ...@@ -24,10 +24,10 @@ use Doctrine\DBAL\Query\Expression\CompositeExpression,
/** /**
* QueryBuilder class is responsible to dynamically create SQL queries. * QueryBuilder class is responsible to dynamically create SQL queries.
* *
* Important: Verify that every feature you use will work with your database vendor. * Important: Verify that every feature you use will work with your database vendor.
* SQL Query Builder does not attempt to validate the generated SQL at all. * SQL Query Builder does not attempt to validate the generated SQL at all.
* *
* The query builder does no validation whatsoever if certain features even work with the * The query builder does no validation whatsoever if certain features even work with the
* underlying database vendor. Limit queries and joins are NOT applied to UPDATE and DELETE statements * underlying database vendor. Limit queries and joins are NOT applied to UPDATE and DELETE statements
* even if some vendors such as MySQL support it. * even if some vendors such as MySQL support it.
...@@ -102,10 +102,10 @@ class QueryBuilder ...@@ -102,10 +102,10 @@ class QueryBuilder
* @var integer The maximum number of results to retrieve. * @var integer The maximum number of results to retrieve.
*/ */
private $maxResults = null; private $maxResults = null;
/** /**
* The counter of bound parameters used with {@see bindValue) * The counter of bound parameters used with {@see bindValue)
* *
* @var int * @var int
*/ */
private $boundCounter = 0; private $boundCounter = 0;
...@@ -170,14 +170,14 @@ class QueryBuilder ...@@ -170,14 +170,14 @@ class QueryBuilder
{ {
return $this->state; return $this->state;
} }
/** /**
* Execute this query using the bound parameters and their types. * Execute this query using the bound parameters and their types.
* *
* Uses {@see Connection::executeQuery} for select statements and {@see Connection::executeUpdate} * Uses {@see Connection::executeQuery} for select statements and {@see Connection::executeUpdate}
* for insert, update and delete statements. * for insert, update and delete statements.
* *
* @return mixed * @return mixed
*/ */
public function execute() public function execute()
{ {
...@@ -390,7 +390,7 @@ class QueryBuilder ...@@ -390,7 +390,7 @@ class QueryBuilder
} }
$this->sqlParts[$sqlPartName] = $sqlPart; $this->sqlParts[$sqlPartName] = $sqlPart;
return $this; return $this;
} }
...@@ -604,7 +604,7 @@ class QueryBuilder ...@@ -604,7 +604,7 @@ class QueryBuilder
) )
), true); ), true);
} }
/** /**
* Creates and adds a right join to the query. * Creates and adds a right join to the query.
* *
...@@ -939,69 +939,76 @@ class QueryBuilder ...@@ -939,69 +939,76 @@ class QueryBuilder
return $this; return $this;
} }
/** /**
* Converts this instance into a SELECT string in SQL. * Converts this instance into a SELECT string in SQL.
* *
* @return string * @return string
*/ */
private function getSQLForSelect() private function getSQLForSelect()
{ {
$query = 'SELECT ' . implode(', ', $this->sqlParts['select']) . ' FROM '; $query = 'SELECT ' . implode(', ', $this->sqlParts['select']) . ' FROM ';
$fromClauses = array(); $fromClauses = array();
// Loop through all FROM clauses // Loop through all FROM clauses
foreach ($this->sqlParts['from'] as $from) { foreach ($this->sqlParts['from'] as $from) {
$fromClause = $from['table'] . ' ' . $from['alias']; $fromClause = $from['table'] . ' ' . $from['alias'];
if (isset($this->sqlParts['join'][$from['alias']])) { if (isset($this->sqlParts['join'][$from['alias']])) {
foreach ($this->sqlParts['join'][$from['alias']] as $join) { foreach ($this->sqlParts['join'][$from['alias']] as $join) {
$fromClause .= ' ' . strtoupper($join['joinType']) $fromClause .= ' ' . strtoupper($join['joinType'])
. ' JOIN ' . $join['joinTable'] . ' ' . $join['joinAlias'] . ' JOIN ' . $join['joinTable'] . ' ' . $join['joinAlias']
. ' ON ' . ((string) $join['joinCondition']); . ' ON ' . ((string) $join['joinCondition']);
} }
} }
$fromClauses[] = $fromClause; $fromClauses[$from['alias']] = $fromClause;
} }
$query .= implode(', ', $fromClauses) // loop through all JOIN clasues for validation purpose
foreach ($this->sqlParts['join'] as $fromAlias => $joins) {
if ( ! isset($fromClauses[$fromAlias]) ) {
throw QueryException::unknownFromAlias($fromAlias, array_keys($fromClauses));
}
}
$query .= implode(', ', $fromClauses)
. ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : '') . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : '')
. ($this->sqlParts['groupBy'] ? ' GROUP BY ' . implode(', ', $this->sqlParts['groupBy']) : '') . ($this->sqlParts['groupBy'] ? ' GROUP BY ' . implode(', ', $this->sqlParts['groupBy']) : '')
. ($this->sqlParts['having'] !== null ? ' HAVING ' . ((string) $this->sqlParts['having']) : '') . ($this->sqlParts['having'] !== null ? ' HAVING ' . ((string) $this->sqlParts['having']) : '')
. ($this->sqlParts['orderBy'] ? ' ORDER BY ' . implode(', ', $this->sqlParts['orderBy']) : ''); . ($this->sqlParts['orderBy'] ? ' ORDER BY ' . implode(', ', $this->sqlParts['orderBy']) : '');
return ($this->maxResults === null && $this->firstResult == null) return ($this->maxResults === null && $this->firstResult == null)
? $query ? $query
: $this->connection->getDatabasePlatform()->modifyLimitQuery($query, $this->maxResults, $this->firstResult); : $this->connection->getDatabasePlatform()->modifyLimitQuery($query, $this->maxResults, $this->firstResult);
} }
/** /**
* Converts this instance into an UPDATE string in SQL. * Converts this instance into an UPDATE string in SQL.
* *
* @return string * @return string
*/ */
private function getSQLForUpdate() private function getSQLForUpdate()
{ {
$table = $this->sqlParts['from']['table'] . ($this->sqlParts['from']['alias'] ? ' ' . $this->sqlParts['from']['alias'] : ''); $table = $this->sqlParts['from']['table'] . ($this->sqlParts['from']['alias'] ? ' ' . $this->sqlParts['from']['alias'] : '');
$query = 'UPDATE ' . $table $query = 'UPDATE ' . $table
. ' SET ' . implode(", ", $this->sqlParts['set']) . ' SET ' . implode(", ", $this->sqlParts['set'])
. ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : ''); . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : '');
return $query; return $query;
} }
/** /**
* Converts this instance into a DELETE string in SQL. * Converts this instance into a DELETE string in SQL.
* *
* @return string * @return string
*/ */
private function getSQLForDelete() private function getSQLForDelete()
{ {
$table = $this->sqlParts['from']['table'] . ($this->sqlParts['from']['alias'] ? ' ' . $this->sqlParts['from']['alias'] : ''); $table = $this->sqlParts['from']['table'] . ($this->sqlParts['from']['alias'] ? ' ' . $this->sqlParts['from']['alias'] : '');
$query = 'DELETE FROM ' . $table . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : ''); $query = 'DELETE FROM ' . $table . ($this->sqlParts['where'] !== null ? ' WHERE ' . ((string) $this->sqlParts['where']) : '');
return $query; return $query;
} }
...@@ -1015,7 +1022,7 @@ class QueryBuilder ...@@ -1015,7 +1022,7 @@ class QueryBuilder
{ {
return $this->getSQL(); return $this->getSQL();
} }
/** /**
* Create a new named parameter and bind the value $value to it. * Create a new named parameter and bind the value $value to it.
* *
...@@ -1053,15 +1060,15 @@ class QueryBuilder ...@@ -1053,15 +1060,15 @@ class QueryBuilder
return $placeHolder; return $placeHolder;
} }
/** /**
* Create a new positional parameter and bind the given value to it. * Create a new positional parameter and bind the given value to it.
* *
* Attention: If you are using positional parameters with the query builder you have * Attention: If you are using positional parameters with the query builder you have
* to be very careful to bind all parameters in the order they appear in the SQL * to be very careful to bind all parameters in the order they appear in the SQL
* statement , otherwise they get bound in the wrong order which can lead to serious * statement , otherwise they get bound in the wrong order which can lead to serious
* bugs in your code. * bugs in your code.
* *
* Example: * Example:
* <code> * <code>
* $qb = $conn->createQueryBuilder(); * $qb = $conn->createQueryBuilder();
...@@ -1070,7 +1077,7 @@ class QueryBuilder ...@@ -1070,7 +1077,7 @@ class QueryBuilder
* ->where('u.username = ' . $qb->createPositionalParameter('Foo', PDO::PARAM_STR)) * ->where('u.username = ' . $qb->createPositionalParameter('Foo', PDO::PARAM_STR))
* ->orWhere('u.username = ' . $qb->createPositionalParameter('Bar', PDO::PARAM_STR)) * ->orWhere('u.username = ' . $qb->createPositionalParameter('Bar', PDO::PARAM_STR))
* </code> * </code>
* *
* @param mixed $value * @param mixed $value
* @param mixed $type * @param mixed $type
* @return string * @return string
......
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\DBAL\Query;
use Doctrine\DBAL\DBALException;
/**
* Driver interface.
* Interface that all DBAL drivers must implement.
*
* @since 2.1.4
*/
class QueryException extends DBALException
{
static public function unknownFromAlias($alias, $registeredAliases)
{
return new self("The given alias '" . $alias . "' is not part of " .
"any FROM clause table. The currently registered FROM-clause " .
"aliases are: " . implode(", ", $registeredAliases) . ". Join clauses " .
"are bound to from clauses to provide support for mixing of multiple " .
"from and join clauses.");
}
}
\ No newline at end of file
...@@ -13,539 +13,560 @@ require_once __DIR__ . '/../../TestInit.php'; ...@@ -13,539 +13,560 @@ require_once __DIR__ . '/../../TestInit.php';
class QueryBuilderTest extends \Doctrine\Tests\DbalTestCase class QueryBuilderTest extends \Doctrine\Tests\DbalTestCase
{ {
protected $conn; protected $conn;
public function setUp() public function setUp()
{ {
$this->conn = $this->getMock('Doctrine\DBAL\Connection', array(), array(), '', false); $this->conn = $this->getMock('Doctrine\DBAL\Connection', array(), array(), '', false);
$expressionBuilder = new ExpressionBuilder($this->conn); $expressionBuilder = new ExpressionBuilder($this->conn);
$this->conn->expects($this->any()) $this->conn->expects($this->any())
->method('getExpressionBuilder') ->method('getExpressionBuilder')
->will($this->returnValue($expressionBuilder)); ->will($this->returnValue($expressionBuilder));
} }
public function testSimpleSelect() public function testSimpleSelect()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->select('u.id') $qb->select('u.id')
->from('users', 'u'); ->from('users', 'u');
$this->assertEquals('SELECT u.id FROM users u', (string) $qb); $this->assertEquals('SELECT u.id FROM users u', (string) $qb);
} }
public function testSelectWithSimpleWhere() public function testSelectWithSimpleWhere()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.id') $qb->select('u.id')
->from('users', 'u') ->from('users', 'u')
->where($expr->andX($expr->eq('u.nickname', '?'))); ->where($expr->andX($expr->eq('u.nickname', '?')));
$this->assertEquals("SELECT u.id FROM users u WHERE u.nickname = ?", (string) $qb); $this->assertEquals("SELECT u.id FROM users u WHERE u.nickname = ?", (string) $qb);
} }
public function testSelectWithLeftJoin() public function testSelectWithLeftJoin()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->leftJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id')); ->leftJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id'));
$this->assertEquals('SELECT u.*, p.* FROM users u LEFT JOIN phones p ON p.user_id = u.id', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u LEFT JOIN phones p ON p.user_id = u.id', (string) $qb);
} }
public function testSelectWithJoin() public function testSelectWithJoin()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->Join('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id')); ->Join('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id'));
$this->assertEquals('SELECT u.*, p.* FROM users u INNER JOIN phones p ON p.user_id = u.id', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u INNER JOIN phones p ON p.user_id = u.id', (string) $qb);
} }
public function testSelectWithInnerJoin() public function testSelectWithInnerJoin()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->innerJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id')); ->innerJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id'));
$this->assertEquals('SELECT u.*, p.* FROM users u INNER JOIN phones p ON p.user_id = u.id', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u INNER JOIN phones p ON p.user_id = u.id', (string) $qb);
} }
public function testSelectWithRightJoin() public function testSelectWithRightJoin()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->rightJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id')); ->rightJoin('u', 'phones', 'p', $expr->eq('p.user_id', 'u.id'));
$this->assertEquals('SELECT u.*, p.* FROM users u RIGHT JOIN phones p ON p.user_id = u.id', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u RIGHT JOIN phones p ON p.user_id = u.id', (string) $qb);
} }
public function testSelectWithAndWhereConditions() public function testSelectWithAndWhereConditions()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->where('u.username = ?') ->where('u.username = ?')
->andWhere('u.name = ?'); ->andWhere('u.name = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) AND (u.name = ?)', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) AND (u.name = ?)', (string) $qb);
} }
public function testSelectWithOrWhereConditions() public function testSelectWithOrWhereConditions()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->where('u.username = ?') ->where('u.username = ?')
->orWhere('u.name = ?'); ->orWhere('u.name = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)', (string) $qb);
} }
public function testSelectWithOrOrWhereConditions() public function testSelectWithOrOrWhereConditions()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->orWhere('u.username = ?') ->orWhere('u.username = ?')
->orWhere('u.name = ?'); ->orWhere('u.name = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)', (string) $qb);
} }
public function testSelectWithAndOrWhereConditions() public function testSelectWithAndOrWhereConditions()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->where('u.username = ?') ->where('u.username = ?')
->andWhere('u.username = ?') ->andWhere('u.username = ?')
->orWhere('u.name = ?') ->orWhere('u.name = ?')
->andWhere('u.name = ?'); ->andWhere('u.name = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u WHERE (((u.username = ?) AND (u.username = ?)) OR (u.name = ?)) AND (u.name = ?)', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u WHERE (((u.username = ?) AND (u.username = ?)) OR (u.name = ?)) AND (u.name = ?)', (string) $qb);
} }
public function testSelectGroupBy() public function testSelectGroupBy()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id'); ->groupBy('u.id');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id', (string) $qb);
} }
public function testSelectEmptyGroupBy() public function testSelectEmptyGroupBy()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->groupBy(array()) ->groupBy(array())
->from('users', 'u'); ->from('users', 'u');
$this->assertEquals('SELECT u.*, p.* FROM users u', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
} }
public function testSelectEmptyAddGroupBy() public function testSelectEmptyAddGroupBy()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->addGroupBy(array()) ->addGroupBy(array())
->from('users', 'u'); ->from('users', 'u');
$this->assertEquals('SELECT u.*, p.* FROM users u', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
} }
public function testSelectAddGroupBy() public function testSelectAddGroupBy()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id') ->groupBy('u.id')
->addGroupBy('u.foo'); ->addGroupBy('u.foo');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo', (string) $qb);
} }
public function testSelectAddGroupBys() public function testSelectAddGroupBys()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id') ->groupBy('u.id')
->addGroupBy('u.foo', 'u.bar'); ->addGroupBy('u.foo', 'u.bar');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo, u.bar', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo, u.bar', (string) $qb);
} }
public function testSelectHaving() public function testSelectHaving()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id') ->groupBy('u.id')
->having('u.name = ?'); ->having('u.name = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING u.name = ?', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING u.name = ?', (string) $qb);
} }
public function testSelectAndHaving() public function testSelectAndHaving()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id') ->groupBy('u.id')
->andHaving('u.name = ?'); ->andHaving('u.name = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING u.name = ?', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING u.name = ?', (string) $qb);
} }
public function testSelectHavingAndHaving() public function testSelectHavingAndHaving()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id') ->groupBy('u.id')
->having('u.name = ?') ->having('u.name = ?')
->andHaving('u.username = ?'); ->andHaving('u.username = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) AND (u.username = ?)', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) AND (u.username = ?)', (string) $qb);
} }
public function testSelectHavingOrHaving() public function testSelectHavingOrHaving()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id') ->groupBy('u.id')
->having('u.name = ?') ->having('u.name = ?')
->orHaving('u.username = ?'); ->orHaving('u.username = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) OR (u.username = ?)', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) OR (u.username = ?)', (string) $qb);
} }
public function testSelectOrHavingOrHaving() public function testSelectOrHavingOrHaving()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id') ->groupBy('u.id')
->orHaving('u.name = ?') ->orHaving('u.name = ?')
->orHaving('u.username = ?'); ->orHaving('u.username = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) OR (u.username = ?)', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) OR (u.username = ?)', (string) $qb);
} }
public function testSelectHavingAndOrHaving() public function testSelectHavingAndOrHaving()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->groupBy('u.id') ->groupBy('u.id')
->having('u.name = ?') ->having('u.name = ?')
->orHaving('u.username = ?') ->orHaving('u.username = ?')
->andHaving('u.username = ?'); ->andHaving('u.username = ?');
$this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING ((u.name = ?) OR (u.username = ?)) AND (u.username = ?)', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u GROUP BY u.id HAVING ((u.name = ?) OR (u.username = ?)) AND (u.username = ?)', (string) $qb);
} }
public function testSelectOrderBy() public function testSelectOrderBy()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->orderBy('u.name'); ->orderBy('u.name');
$this->assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC', (string) $qb);
} }
public function testSelectAddOrderBy() public function testSelectAddOrderBy()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->orderBy('u.name') ->orderBy('u.name')
->addOrderBy('u.username', 'DESC'); ->addOrderBy('u.username', 'DESC');
$this->assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC, u.username DESC', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC, u.username DESC', (string) $qb);
} }
public function testSelectAddAddOrderBy() public function testSelectAddAddOrderBy()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*', 'p.*') $qb->select('u.*', 'p.*')
->from('users', 'u') ->from('users', 'u')
->addOrderBy('u.name') ->addOrderBy('u.name')
->addOrderBy('u.username', 'DESC'); ->addOrderBy('u.username', 'DESC');
$this->assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC, u.username DESC', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u ORDER BY u.name ASC, u.username DESC', (string) $qb);
} }
public function testEmptySelect() public function testEmptySelect()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb2 = $qb->select(); $qb2 = $qb->select();
$this->assertSame($qb, $qb2); $this->assertSame($qb, $qb2);
$this->assertEquals(QueryBuilder::SELECT, $qb->getType()); $this->assertEquals(QueryBuilder::SELECT, $qb->getType());
} }
public function testSelectAddSelect() public function testSelectAddSelect()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*') $qb->select('u.*')
->addSelect('p.*') ->addSelect('p.*')
->from('users', 'u'); ->from('users', 'u');
$this->assertEquals('SELECT u.*, p.* FROM users u', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u', (string) $qb);
} }
public function testEmptyAddSelect() public function testEmptyAddSelect()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb2 = $qb->addSelect(); $qb2 = $qb->addSelect();
$this->assertSame($qb, $qb2); $this->assertSame($qb, $qb2);
$this->assertEquals(QueryBuilder::SELECT, $qb->getType()); $this->assertEquals(QueryBuilder::SELECT, $qb->getType());
} }
public function testSelectMultipleFrom() public function testSelectMultipleFrom()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$expr = $qb->expr(); $expr = $qb->expr();
$qb->select('u.*') $qb->select('u.*')
->addSelect('p.*') ->addSelect('p.*')
->from('users', 'u') ->from('users', 'u')
->from('phonenumbers', 'p'); ->from('phonenumbers', 'p');
$this->assertEquals('SELECT u.*, p.* FROM users u, phonenumbers p', (string) $qb); $this->assertEquals('SELECT u.*, p.* FROM users u, phonenumbers p', (string) $qb);
} }
public function testUpdate() public function testUpdate()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->update('users', 'u') $qb->update('users', 'u')
->set('u.foo', '?') ->set('u.foo', '?')
->set('u.bar', '?'); ->set('u.bar', '?');
$this->assertEquals(QueryBuilder::UPDATE, $qb->getType()); $this->assertEquals(QueryBuilder::UPDATE, $qb->getType());
$this->assertEquals('UPDATE users u SET u.foo = ?, u.bar = ?', (string) $qb); $this->assertEquals('UPDATE users u SET u.foo = ?, u.bar = ?', (string) $qb);
} }
public function testUpdateWithoutAlias() public function testUpdateWithoutAlias()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->update('users') $qb->update('users')
->set('foo', '?') ->set('foo', '?')
->set('bar', '?'); ->set('bar', '?');
$this->assertEquals('UPDATE users SET foo = ?, bar = ?', (string) $qb); $this->assertEquals('UPDATE users SET foo = ?, bar = ?', (string) $qb);
} }
public function testUpdateWhere() public function testUpdateWhere()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->update('users', 'u') $qb->update('users', 'u')
->set('u.foo', '?') ->set('u.foo', '?')
->where('u.foo = ?'); ->where('u.foo = ?');
$this->assertEquals('UPDATE users u SET u.foo = ? WHERE u.foo = ?', (string) $qb); $this->assertEquals('UPDATE users u SET u.foo = ? WHERE u.foo = ?', (string) $qb);
} }
public function testEmptyUpdate() public function testEmptyUpdate()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb2 = $qb->update(); $qb2 = $qb->update();
$this->assertEquals(QueryBuilder::UPDATE, $qb->getType()); $this->assertEquals(QueryBuilder::UPDATE, $qb->getType());
$this->assertSame($qb2, $qb); $this->assertSame($qb2, $qb);
} }
public function testDelete() public function testDelete()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->delete('users', 'u'); $qb->delete('users', 'u');
$this->assertEquals(QueryBuilder::DELETE, $qb->getType()); $this->assertEquals(QueryBuilder::DELETE, $qb->getType());
$this->assertEquals('DELETE FROM users u', (string) $qb); $this->assertEquals('DELETE FROM users u', (string) $qb);
} }
public function testDeleteWithoutAlias() public function testDeleteWithoutAlias()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->delete('users'); $qb->delete('users');
$this->assertEquals(QueryBuilder::DELETE, $qb->getType()); $this->assertEquals(QueryBuilder::DELETE, $qb->getType());
$this->assertEquals('DELETE FROM users', (string) $qb); $this->assertEquals('DELETE FROM users', (string) $qb);
} }
public function testDeleteWhere() public function testDeleteWhere()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->delete('users', 'u') $qb->delete('users', 'u')
->where('u.foo = ?'); ->where('u.foo = ?');
$this->assertEquals('DELETE FROM users u WHERE u.foo = ?', (string) $qb); $this->assertEquals('DELETE FROM users u WHERE u.foo = ?', (string) $qb);
} }
public function testEmptyDelete() public function testEmptyDelete()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb2 = $qb->delete(); $qb2 = $qb->delete();
$this->assertEquals(QueryBuilder::DELETE, $qb->getType()); $this->assertEquals(QueryBuilder::DELETE, $qb->getType());
$this->assertSame($qb2, $qb); $this->assertSame($qb2, $qb);
} }
public function testGetConnection() public function testGetConnection()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$this->assertSame($this->conn, $qb->getConnection()); $this->assertSame($this->conn, $qb->getConnection());
} }
public function testGetState() public function testGetState()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$this->assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState()); $this->assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
$qb->select('u.*')->from('users', 'u'); $qb->select('u.*')->from('users', 'u');
$this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState()); $this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
$sql1 = $qb->getSQL(); $sql1 = $qb->getSQL();
$this->assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState()); $this->assertEquals(QueryBuilder::STATE_CLEAN, $qb->getState());
$this->assertEquals($sql1, $qb->getSQL()); $this->assertEquals($sql1, $qb->getSQL());
} }
public function testSetMaxResults() public function testSetMaxResults()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->setMaxResults(10); $qb->setMaxResults(10);
$this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState()); $this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
$this->assertEQuals(10, $qb->getMaxResults()); $this->assertEQuals(10, $qb->getMaxResults());
} }
public function testSetFirstResult() public function testSetFirstResult()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->setFirstResult(10); $qb->setFirstResult(10);
$this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState()); $this->assertEquals(QueryBuilder::STATE_DIRTY, $qb->getState());
$this->assertEQuals(10, $qb->getFirstResult()); $this->assertEQuals(10, $qb->getFirstResult());
} }
public function testResetQueryPart() public function testResetQueryPart()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->select('u.*')->from('users', 'u')->where('u.name = ?'); $qb->select('u.*')->from('users', 'u')->where('u.name = ?');
$this->assertEquals('SELECT u.* FROM users u WHERE u.name = ?', (string)$qb); $this->assertEquals('SELECT u.* FROM users u WHERE u.name = ?', (string)$qb);
$qb->resetQueryPart('where'); $qb->resetQueryPart('where');
$this->assertEquals('SELECT u.* FROM users u', (string)$qb); $this->assertEquals('SELECT u.* FROM users u', (string)$qb);
} }
public function testResetQueryParts() public function testResetQueryParts()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->select('u.*')->from('users', 'u')->where('u.name = ?')->orderBy('u.name'); $qb->select('u.*')->from('users', 'u')->where('u.name = ?')->orderBy('u.name');
$this->assertEquals('SELECT u.* FROM users u WHERE u.name = ? ORDER BY u.name ASC', (string)$qb); $this->assertEquals('SELECT u.* FROM users u WHERE u.name = ? ORDER BY u.name ASC', (string)$qb);
$qb->resetQueryParts(array('where', 'orderBy')); $qb->resetQueryParts(array('where', 'orderBy'));
$this->assertEquals('SELECT u.* FROM users u', (string)$qb); $this->assertEquals('SELECT u.* FROM users u', (string)$qb);
} }
public function testCreateNamedParameter() public function testCreateNamedParameter()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->select('u.*')->from('users', 'u')->where( $qb->select('u.*')->from('users', 'u')->where(
$qb->expr()->eq('u.name', $qb->createNamedParameter(10, \PDO::PARAM_INT)) $qb->expr()->eq('u.name', $qb->createNamedParameter(10, \PDO::PARAM_INT))
); );
$this->assertEquals('SELECT u.* FROM users u WHERE u.name = :dcValue1', (string)$qb); $this->assertEquals('SELECT u.* FROM users u WHERE u.name = :dcValue1', (string)$qb);
$this->assertEquals(10, $qb->getParameter('dcValue1')); $this->assertEquals(10, $qb->getParameter('dcValue1'));
} }
public function testCreateNamedParameterCustomPlaceholder() public function testCreateNamedParameterCustomPlaceholder()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->select('u.*')->from('users', 'u')->where( $qb->select('u.*')->from('users', 'u')->where(
$qb->expr()->eq('u.name', $qb->createNamedParameter(10, \PDO::PARAM_INT, ':test')) $qb->expr()->eq('u.name', $qb->createNamedParameter(10, \PDO::PARAM_INT, ':test'))
); );
$this->assertEquals('SELECT u.* FROM users u WHERE u.name = :test', (string)$qb); $this->assertEquals('SELECT u.* FROM users u WHERE u.name = :test', (string)$qb);
$this->assertEquals(10, $qb->getParameter('test')); $this->assertEquals(10, $qb->getParameter('test'));
} }
public function testCreatePositionalParameter() public function testCreatePositionalParameter()
{ {
$qb = new QueryBuilder($this->conn); $qb = new QueryBuilder($this->conn);
$qb->select('u.*')->from('users', 'u')->where( $qb->select('u.*')->from('users', 'u')->where(
$qb->expr()->eq('u.name', $qb->createPositionalParameter(10, \PDO::PARAM_INT)) $qb->expr()->eq('u.name', $qb->createPositionalParameter(10, \PDO::PARAM_INT))
); );
$this->assertEquals('SELECT u.* FROM users u WHERE u.name = ?', (string)$qb); $this->assertEquals('SELECT u.* FROM users u WHERE u.name = ?', (string)$qb);
$this->assertEquals(10, $qb->getParameter(1)); $this->assertEquals(10, $qb->getParameter(1));
} }
/**
* @group DBAL-172
*/
public function testReferenceJoinFromJoin()
{
$qb = new QueryBuilder($this->conn);
$qb->select("l.id", "mdsh.xcode", "mdso.xcode")
->from("location_tree", "l")
->join("l", "location_tree_pos", "p", "l.id = p.tree_id")
->rightJoin("l", "hotel", "h", "h.location_id = l.id")
->leftJoin("l", "offer_location", "ol", "l.id=ol.location_id")
->leftJoin("ol", "mds_offer", "mdso", "ol.offer_id = mdso.offer_id")
->leftJoin("h", "mds_hotel", "mdsh", "h.id = mdsh.hotel_id")
->where("p.parent_id IN (:ids)")
->andWhere("(mdso.xcode IS NOT NULL OR mdsh.xcode IS NOT NULL)");
$this->setExpectedException('Doctrine\DBAL\Query\QueryException', "The given alias 'ol' is not part of any FROM clause table. The currently registered FROM-clause aliases are: l");
$this->assertEquals('', $qb->getSQL());
}
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment