Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
cc09204a
Commit
cc09204a
authored
Oct 30, 2011
by
Benjamin Eberlei
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'DBAL-172' into 2.1.x
parents
7df036a6
fa092140
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
234 additions
and
166 deletions
+234
-166
QueryBuilder.php
lib/Doctrine/DBAL/Query/QueryBuilder.php
+42
-35
QueryException.php
lib/Doctrine/DBAL/Query/QueryException.php
+40
-0
QueryBuilderTest.php
tests/Doctrine/Tests/DBAL/Query/QueryBuilderTest.php
+152
-131
No files found.
lib/Doctrine/DBAL/Query/QueryBuilder.php
View file @
cc09204a
...
...
@@ -24,10 +24,10 @@ use Doctrine\DBAL\Query\Expression\CompositeExpression,
/**
* QueryBuilder class is responsible to dynamically create SQL queries.
*
*
* 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.
*
*
* 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
* even if some vendors such as MySQL support it.
...
...
@@ -102,10 +102,10 @@ class QueryBuilder
* @var integer The maximum number of results to retrieve.
*/
private
$maxResults
=
null
;
/**
* The counter of bound parameters used with {@see bindValue)
*
*
* @var int
*/
private
$boundCounter
=
0
;
...
...
@@ -170,14 +170,14 @@ class QueryBuilder
{
return
$this
->
state
;
}
/**
* Execute this query using the bound parameters and their types.
*
*
* Uses {@see Connection::executeQuery} for select statements and {@see Connection::executeUpdate}
* for insert, update and delete statements.
*
* @return mixed
*
* @return mixed
*/
public
function
execute
()
{
...
...
@@ -390,7 +390,7 @@ class QueryBuilder
}
$this
->
sqlParts
[
$sqlPartName
]
=
$sqlPart
;
return
$this
;
}
...
...
@@ -604,7 +604,7 @@ class QueryBuilder
)
),
true
);
}
/**
* Creates and adds a right join to the query.
*
...
...
@@ -939,69 +939,76 @@ class QueryBuilder
return
$this
;
}
/**
* Converts this instance into a SELECT string in SQL.
*
*
* @return string
*/
private
function
getSQLForSelect
()
{
$query
=
'SELECT '
.
implode
(
', '
,
$this
->
sqlParts
[
'select'
])
.
' FROM '
;
$fromClauses
=
array
();
// Loop through all FROM clauses
foreach
(
$this
->
sqlParts
[
'from'
]
as
$from
)
{
$fromClause
=
$from
[
'table'
]
.
' '
.
$from
[
'alias'
];
if
(
isset
(
$this
->
sqlParts
[
'join'
][
$from
[
'alias'
]]))
{
foreach
(
$this
->
sqlParts
[
'join'
][
$from
[
'alias'
]]
as
$join
)
{
$fromClause
.=
' '
.
strtoupper
(
$join
[
'joinType'
])
.
' JOIN '
.
$join
[
'joinTable'
]
.
' '
.
$join
[
'joinAlias'
]
$fromClause
.=
' '
.
strtoupper
(
$join
[
'joinType'
])
.
' JOIN '
.
$join
[
'joinTable'
]
.
' '
.
$join
[
'joinAlias'
]
.
' 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
[
'groupBy'
]
?
' GROUP BY '
.
implode
(
', '
,
$this
->
sqlParts
[
'groupBy'
])
:
''
)
.
(
$this
->
sqlParts
[
'having'
]
!==
null
?
' HAVING '
.
((
string
)
$this
->
sqlParts
[
'having'
])
:
''
)
.
(
$this
->
sqlParts
[
'orderBy'
]
?
' ORDER BY '
.
implode
(
', '
,
$this
->
sqlParts
[
'orderBy'
])
:
''
);
return
(
$this
->
maxResults
===
null
&&
$this
->
firstResult
==
null
)
return
(
$this
->
maxResults
===
null
&&
$this
->
firstResult
==
null
)
?
$query
:
$this
->
connection
->
getDatabasePlatform
()
->
modifyLimitQuery
(
$query
,
$this
->
maxResults
,
$this
->
firstResult
);
}
/**
* Converts this instance into an UPDATE string in SQL.
*
*
* @return string
*/
private
function
getSQLForUpdate
()
{
$table
=
$this
->
sqlParts
[
'from'
][
'table'
]
.
(
$this
->
sqlParts
[
'from'
][
'alias'
]
?
' '
.
$this
->
sqlParts
[
'from'
][
'alias'
]
:
''
);
$query
=
'UPDATE '
.
$table
$query
=
'UPDATE '
.
$table
.
' SET '
.
implode
(
", "
,
$this
->
sqlParts
[
'set'
])
.
(
$this
->
sqlParts
[
'where'
]
!==
null
?
' WHERE '
.
((
string
)
$this
->
sqlParts
[
'where'
])
:
''
);
return
$query
;
}
/**
* Converts this instance into a DELETE string in SQL.
*
*
* @return string
*/
private
function
getSQLForDelete
()
{
$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'
])
:
''
);
return
$query
;
}
...
...
@@ -1015,7 +1022,7 @@ class QueryBuilder
{
return
$this
->
getSQL
();
}
/**
* Create a new named parameter and bind the value $value to it.
*
...
...
@@ -1053,15 +1060,15 @@ class QueryBuilder
return
$placeHolder
;
}
/**
* 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
* 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
* bugs in your code.
*
*
* Example:
* <code>
* $qb = $conn->createQueryBuilder();
...
...
@@ -1070,7 +1077,7 @@ class QueryBuilder
* ->where('u.username = ' . $qb->createPositionalParameter('Foo', PDO::PARAM_STR))
* ->orWhere('u.username = ' . $qb->createPositionalParameter('Bar', PDO::PARAM_STR))
* </code>
*
*
* @param mixed $value
* @param mixed $type
* @return string
...
...
lib/Doctrine/DBAL/Query/QueryException.php
0 → 100644
View file @
cc09204a
<?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
tests/Doctrine/Tests/DBAL/Query/QueryBuilderTest.php
View file @
cc09204a
...
...
@@ -13,539 +13,560 @@ require_once __DIR__ . '/../../TestInit.php';
class
QueryBuilderTest
extends
\Doctrine\Tests\DbalTestCase
{
protected
$conn
;
public
function
setUp
()
{
$this
->
conn
=
$this
->
getMock
(
'Doctrine\DBAL\Connection'
,
array
(),
array
(),
''
,
false
);
$expressionBuilder
=
new
ExpressionBuilder
(
$this
->
conn
);
$this
->
conn
->
expects
(
$this
->
any
())
->
method
(
'getExpressionBuilder'
)
->
will
(
$this
->
returnValue
(
$expressionBuilder
));
}
public
function
testSimpleSelect
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
select
(
'u.id'
)
->
from
(
'users'
,
'u'
);
$this
->
assertEquals
(
'SELECT u.id FROM users u'
,
(
string
)
$qb
);
}
public
function
testSelectWithSimpleWhere
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.id'
)
->
from
(
'users'
,
'u'
)
->
where
(
$expr
->
andX
(
$expr
->
eq
(
'u.nickname'
,
'?'
)));
$this
->
assertEquals
(
"SELECT u.id FROM users u WHERE u.nickname = ?"
,
(
string
)
$qb
);
}
public
function
testSelectWithLeftJoin
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
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
);
}
public
function
testSelectWithJoin
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
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
);
}
public
function
testSelectWithInnerJoin
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
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
);
}
public
function
testSelectWithRightJoin
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
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
);
}
public
function
testSelectWithAndWhereConditions
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
where
(
'u.username = ?'
)
->
andWhere
(
'u.name = ?'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u WHERE (u.username = ?) AND (u.name = ?)'
,
(
string
)
$qb
);
}
public
function
testSelectWithOrWhereConditions
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
where
(
'u.username = ?'
)
->
orWhere
(
'u.name = ?'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)'
,
(
string
)
$qb
);
}
public
function
testSelectWithOrOrWhereConditions
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
orWhere
(
'u.username = ?'
)
->
orWhere
(
'u.name = ?'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u WHERE (u.username = ?) OR (u.name = ?)'
,
(
string
)
$qb
);
}
public
function
testSelectWithAndOrWhereConditions
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
where
(
'u.username = ?'
)
->
andWhere
(
'u.username = ?'
)
->
orWhere
(
'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
);
}
public
function
testSelectGroupBy
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u GROUP BY u.id'
,
(
string
)
$qb
);
}
public
function
testSelectEmptyGroupBy
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
groupBy
(
array
())
->
from
(
'users'
,
'u'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u'
,
(
string
)
$qb
);
}
public
function
testSelectEmptyAddGroupBy
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
addGroupBy
(
array
())
->
from
(
'users'
,
'u'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u'
,
(
string
)
$qb
);
}
public
function
testSelectAddGroupBy
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
)
->
addGroupBy
(
'u.foo'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo'
,
(
string
)
$qb
);
}
public
function
testSelectAddGroupBys
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
)
->
addGroupBy
(
'u.foo'
,
'u.bar'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u GROUP BY u.id, u.foo, u.bar'
,
(
string
)
$qb
);
}
public
function
testSelectHaving
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
)
->
having
(
'u.name = ?'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u GROUP BY u.id HAVING u.name = ?'
,
(
string
)
$qb
);
}
public
function
testSelectAndHaving
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
)
->
andHaving
(
'u.name = ?'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u GROUP BY u.id HAVING u.name = ?'
,
(
string
)
$qb
);
}
public
function
testSelectHavingAndHaving
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
)
->
having
(
'u.name = ?'
)
->
andHaving
(
'u.username = ?'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) AND (u.username = ?)'
,
(
string
)
$qb
);
}
public
function
testSelectHavingOrHaving
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
)
->
having
(
'u.name = ?'
)
->
orHaving
(
'u.username = ?'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) OR (u.username = ?)'
,
(
string
)
$qb
);
}
public
function
testSelectOrHavingOrHaving
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
)
->
orHaving
(
'u.name = ?'
)
->
orHaving
(
'u.username = ?'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u GROUP BY u.id HAVING (u.name = ?) OR (u.username = ?)'
,
(
string
)
$qb
);
}
public
function
testSelectHavingAndOrHaving
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
groupBy
(
'u.id'
)
->
having
(
'u.name = ?'
)
->
orHaving
(
'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
);
}
public
function
testSelectOrderBy
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
orderBy
(
'u.name'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u ORDER BY u.name ASC'
,
(
string
)
$qb
);
}
public
function
testSelectAddOrderBy
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
orderBy
(
'u.name'
)
->
addOrderBy
(
'u.username'
,
'DESC'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u ORDER BY u.name ASC, u.username DESC'
,
(
string
)
$qb
);
}
public
function
testSelectAddAddOrderBy
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
,
'p.*'
)
->
from
(
'users'
,
'u'
)
->
addOrderBy
(
'u.name'
)
->
addOrderBy
(
'u.username'
,
'DESC'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u ORDER BY u.name ASC, u.username DESC'
,
(
string
)
$qb
);
}
public
function
testEmptySelect
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb2
=
$qb
->
select
();
$this
->
assertSame
(
$qb
,
$qb2
);
$this
->
assertEquals
(
QueryBuilder
::
SELECT
,
$qb
->
getType
());
}
public
function
testSelectAddSelect
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
)
->
addSelect
(
'p.*'
)
->
from
(
'users'
,
'u'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u'
,
(
string
)
$qb
);
}
public
function
testEmptyAddSelect
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb2
=
$qb
->
addSelect
();
$this
->
assertSame
(
$qb
,
$qb2
);
$this
->
assertEquals
(
QueryBuilder
::
SELECT
,
$qb
->
getType
());
}
public
function
testSelectMultipleFrom
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$expr
=
$qb
->
expr
();
$qb
->
select
(
'u.*'
)
->
addSelect
(
'p.*'
)
->
from
(
'users'
,
'u'
)
->
from
(
'phonenumbers'
,
'p'
);
$this
->
assertEquals
(
'SELECT u.*, p.* FROM users u, phonenumbers p'
,
(
string
)
$qb
);
}
public
function
testUpdate
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
update
(
'users'
,
'u'
)
->
set
(
'u.foo'
,
'?'
)
->
set
(
'u.bar'
,
'?'
);
$this
->
assertEquals
(
QueryBuilder
::
UPDATE
,
$qb
->
getType
());
$this
->
assertEquals
(
'UPDATE users u SET u.foo = ?, u.bar = ?'
,
(
string
)
$qb
);
}
public
function
testUpdateWithoutAlias
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
update
(
'users'
)
->
set
(
'foo'
,
'?'
)
->
set
(
'bar'
,
'?'
);
$this
->
assertEquals
(
'UPDATE users SET foo = ?, bar = ?'
,
(
string
)
$qb
);
}
public
function
testUpdateWhere
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
update
(
'users'
,
'u'
)
->
set
(
'u.foo'
,
'?'
)
->
where
(
'u.foo = ?'
);
$this
->
assertEquals
(
'UPDATE users u SET u.foo = ? WHERE u.foo = ?'
,
(
string
)
$qb
);
}
public
function
testEmptyUpdate
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb2
=
$qb
->
update
();
$this
->
assertEquals
(
QueryBuilder
::
UPDATE
,
$qb
->
getType
());
$this
->
assertSame
(
$qb2
,
$qb
);
}
public
function
testDelete
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
delete
(
'users'
,
'u'
);
$this
->
assertEquals
(
QueryBuilder
::
DELETE
,
$qb
->
getType
());
$this
->
assertEquals
(
'DELETE FROM users u'
,
(
string
)
$qb
);
}
public
function
testDeleteWithoutAlias
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
delete
(
'users'
);
$this
->
assertEquals
(
QueryBuilder
::
DELETE
,
$qb
->
getType
());
$this
->
assertEquals
(
'DELETE FROM users'
,
(
string
)
$qb
);
}
public
function
testDeleteWhere
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
delete
(
'users'
,
'u'
)
->
where
(
'u.foo = ?'
);
$this
->
assertEquals
(
'DELETE FROM users u WHERE u.foo = ?'
,
(
string
)
$qb
);
}
public
function
testEmptyDelete
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb2
=
$qb
->
delete
();
$this
->
assertEquals
(
QueryBuilder
::
DELETE
,
$qb
->
getType
());
$this
->
assertSame
(
$qb2
,
$qb
);
}
public
function
testGetConnection
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$this
->
assertSame
(
$this
->
conn
,
$qb
->
getConnection
());
}
public
function
testGetState
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$this
->
assertEquals
(
QueryBuilder
::
STATE_CLEAN
,
$qb
->
getState
());
$qb
->
select
(
'u.*'
)
->
from
(
'users'
,
'u'
);
$this
->
assertEquals
(
QueryBuilder
::
STATE_DIRTY
,
$qb
->
getState
());
$sql1
=
$qb
->
getSQL
();
$this
->
assertEquals
(
QueryBuilder
::
STATE_CLEAN
,
$qb
->
getState
());
$this
->
assertEquals
(
$sql1
,
$qb
->
getSQL
());
}
public
function
testSetMaxResults
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
setMaxResults
(
10
);
$this
->
assertEquals
(
QueryBuilder
::
STATE_DIRTY
,
$qb
->
getState
());
$this
->
assertEQuals
(
10
,
$qb
->
getMaxResults
());
}
public
function
testSetFirstResult
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
setFirstResult
(
10
);
$this
->
assertEquals
(
QueryBuilder
::
STATE_DIRTY
,
$qb
->
getState
());
$this
->
assertEQuals
(
10
,
$qb
->
getFirstResult
());
}
public
function
testResetQueryPart
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
select
(
'u.*'
)
->
from
(
'users'
,
'u'
)
->
where
(
'u.name = ?'
);
$this
->
assertEquals
(
'SELECT u.* FROM users u WHERE u.name = ?'
,
(
string
)
$qb
);
$qb
->
resetQueryPart
(
'where'
);
$this
->
assertEquals
(
'SELECT u.* FROM users u'
,
(
string
)
$qb
);
}
public
function
testResetQueryParts
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$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
);
$qb
->
resetQueryParts
(
array
(
'where'
,
'orderBy'
));
$this
->
assertEquals
(
'SELECT u.* FROM users u'
,
(
string
)
$qb
);
}
public
function
testCreateNamedParameter
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
select
(
'u.*'
)
->
from
(
'users'
,
'u'
)
->
where
(
$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
(
10
,
$qb
->
getParameter
(
'dcValue1'
));
}
public
function
testCreateNamedParameterCustomPlaceholder
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
select
(
'u.*'
)
->
from
(
'users'
,
'u'
)
->
where
(
$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
(
10
,
$qb
->
getParameter
(
'test'
));
}
public
function
testCreatePositionalParameter
()
{
$qb
=
new
QueryBuilder
(
$this
->
conn
);
$qb
->
select
(
'u.*'
)
->
from
(
'users'
,
'u'
)
->
where
(
$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
(
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment