2015-07-06 06:00:01 -04:00
< ? php
/**
2016-07-21 11:07:57 -04:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
*
2021-06-04 15:52:51 -04:00
* @ author Arthur Schiwon < blizzz @ arthur - schiwon . de >
2020-03-31 04:49:10 -04:00
* @ author Christoph Wurst < christoph @ winzerhof - wurst . at >
2020-08-24 08:54:25 -04:00
* @ author Daniel Kesselberg < mail @ danielkesselberg . de >
2020-12-30 08:07:05 -05:00
* @ author J0WI < J0WI @ users . noreply . github . com >
2016-07-21 11:07:57 -04:00
* @ author Joas Schilling < coding @ schilljs . com >
2017-11-06 09:56:42 -05:00
* @ author Lukas Reschke < lukas @ statuscode . ch >
2016-07-21 12:13:36 -04:00
* @ author Robin Appelman < robin @ icewind . nl >
2019-12-03 13:57:53 -05:00
* @ author Roeland Jago Douma < roeland @ famdouma . nl >
2016-03-01 11:25:15 -05:00
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
2020-12-16 08:54:15 -05:00
* @ author Vincent Petry < vincent @ nextcloud . com >
2015-07-06 06:00:01 -04:00
*
* @ license AGPL - 3.0
*
* This code is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License , version 3 ,
* as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License , version 3 ,
2019-12-03 13:57:53 -05:00
* along with this program . If not , see < http :// www . gnu . org / licenses />
2015-07-06 06:00:01 -04:00
*
*/
2015-07-07 11:30:26 -04:00
namespace OC\DB\QueryBuilder ;
2015-07-06 06:00:01 -04:00
2021-01-03 09:28:31 -05:00
use Doctrine\DBAL\Platforms\MySQLPlatform ;
use Doctrine\DBAL\Platforms\OraclePlatform ;
use Doctrine\DBAL\Platforms\PostgreSQL94Platform ;
2017-01-16 09:12:30 -05:00
use Doctrine\DBAL\Platforms\SqlitePlatform ;
2020-12-10 04:22:21 -05:00
use Doctrine\DBAL\Query\QueryException ;
2021-01-03 09:28:31 -05:00
use OC\DB\ConnectionAdapter ;
2016-02-05 09:32:34 -05:00
use OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder ;
2016-02-22 13:46:37 -05:00
use OC\DB\QueryBuilder\ExpressionBuilder\MySqlExpressionBuilder ;
2016-02-05 09:32:34 -05:00
use OC\DB\QueryBuilder\ExpressionBuilder\OCIExpressionBuilder ;
use OC\DB\QueryBuilder\ExpressionBuilder\PgSqlExpressionBuilder ;
2017-01-16 09:12:30 -05:00
use OC\DB\QueryBuilder\ExpressionBuilder\SqliteExpressionBuilder ;
use OC\DB\QueryBuilder\FunctionBuilder\FunctionBuilder ;
2017-01-16 09:31:04 -05:00
use OC\DB\QueryBuilder\FunctionBuilder\OCIFunctionBuilder ;
use OC\DB\QueryBuilder\FunctionBuilder\PgSqlFunctionBuilder ;
2017-01-16 09:12:30 -05:00
use OC\DB\QueryBuilder\FunctionBuilder\SqliteFunctionBuilder ;
2021-01-03 09:28:31 -05:00
use OC\DB\ResultAdapter ;
2016-10-28 07:48:58 -04:00
use OC\SystemConfig ;
2021-01-03 09:28:31 -05:00
use OCP\DB\IResult ;
2021-02-26 14:22:08 -05:00
use OCP\DB\QueryBuilder\ICompositeExpression ;
2020-10-02 13:15:34 -04:00
use OCP\DB\QueryBuilder\ILiteral ;
2019-11-22 14:52:10 -05:00
use OCP\DB\QueryBuilder\IParameter ;
2015-07-07 11:30:26 -04:00
use OCP\DB\QueryBuilder\IQueryBuilder ;
use OCP\DB\QueryBuilder\IQueryFunction ;
2022-03-17 11:42:53 -04:00
use Psr\Log\LoggerInterface ;
2015-07-06 06:00:01 -04:00
class QueryBuilder implements IQueryBuilder {
2021-01-03 09:28:31 -05:00
/** @var ConnectionAdapter */
2015-07-06 06:00:01 -04:00
private $connection ;
2016-10-28 07:48:58 -04:00
/** @var SystemConfig */
private $systemConfig ;
2022-03-17 11:42:53 -04:00
private LoggerInterface $logger ;
2016-10-28 07:48:58 -04:00
2015-07-06 06:00:01 -04:00
/** @var \Doctrine\DBAL\Query\QueryBuilder */
private $queryBuilder ;
2015-07-07 11:30:26 -04:00
/** @var QuoteHelper */
private $helper ;
2015-08-10 10:20:42 -04:00
/** @var bool */
private $automaticTablePrefix = true ;
2015-12-09 05:09:02 -05:00
/** @var string */
protected $lastInsertedTable ;
2015-07-06 06:00:01 -04:00
/**
2015-07-20 11:09:27 -04:00
* Initializes a new QueryBuilder .
2015-07-06 06:00:01 -04:00
*
2021-01-03 09:28:31 -05:00
* @ param ConnectionAdapter $connection
2016-10-28 07:48:58 -04:00
* @ param SystemConfig $systemConfig
2015-07-06 06:00:01 -04:00
*/
2022-03-17 11:42:53 -04:00
public function __construct ( ConnectionAdapter $connection , SystemConfig $systemConfig , LoggerInterface $logger ) {
2015-07-06 06:00:01 -04:00
$this -> connection = $connection ;
2016-10-28 07:48:58 -04:00
$this -> systemConfig = $systemConfig ;
$this -> logger = $logger ;
2021-01-03 09:28:31 -05:00
$this -> queryBuilder = new \Doctrine\DBAL\Query\QueryBuilder ( $this -> connection -> getInner ());
2015-07-07 11:30:26 -04:00
$this -> helper = new QuoteHelper ();
2015-07-06 06:00:01 -04:00
}
2015-08-10 10:20:42 -04:00
/**
* Enable / disable automatic prefixing of table names with the oc_ prefix
*
* @ param bool $enabled If set to true table names will be prefixed with the
* owncloud database prefix automatically .
* @ since 8.2 . 0
*/
public function automaticTablePrefix ( $enabled ) {
$this -> automaticTablePrefix = ( bool ) $enabled ;
}
2015-07-06 06:00:01 -04:00
/**
* Gets an ExpressionBuilder used for object - oriented construction of query expressions .
* This producer method is intended for convenient inline usage . Example :
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u' )
* -> from ( 'users' , 'u' )
* -> where ( $qb -> expr () -> eq ( 'u.id' , 1 ));
* </ code >
*
* For more complex expression construction , consider storing the expression
* builder object in a local variable .
*
2015-07-07 11:30:26 -04:00
* @ return \OCP\DB\QueryBuilder\IExpressionBuilder
2015-07-06 06:00:01 -04:00
*/
public function expr () {
2021-01-03 09:28:31 -05:00
if ( $this -> connection -> getDatabasePlatform () instanceof OraclePlatform ) {
2018-01-12 07:44:30 -05:00
return new OCIExpressionBuilder ( $this -> connection , $this );
2021-01-03 09:28:31 -05:00
}
if ( $this -> connection -> getDatabasePlatform () instanceof PostgreSQL94Platform ) {
2018-01-12 07:44:30 -05:00
return new PgSqlExpressionBuilder ( $this -> connection , $this );
2021-01-03 09:28:31 -05:00
}
if ( $this -> connection -> getDatabasePlatform () instanceof MySQLPlatform ) {
2018-01-12 07:44:30 -05:00
return new MySqlExpressionBuilder ( $this -> connection , $this );
2021-01-03 09:28:31 -05:00
}
if ( $this -> connection -> getDatabasePlatform () instanceof SqlitePlatform ) {
2018-01-12 07:44:30 -05:00
return new SqliteExpressionBuilder ( $this -> connection , $this );
2016-01-18 10:03:41 -05:00
}
2021-01-03 09:28:31 -05:00
return new ExpressionBuilder ( $this -> connection , $this );
2015-07-06 06:00:01 -04:00
}
2017-01-16 09:31:04 -05:00
/**
* Gets an FunctionBuilder used for object - oriented construction of query functions .
* This producer method is intended for convenient inline usage . Example :
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u' )
* -> from ( 'users' , 'u' )
* -> where ( $qb -> fun () -> md5 ( 'u.id' ));
* </ code >
*
* For more complex function construction , consider storing the function
* builder object in a local variable .
*
* @ return \OCP\DB\QueryBuilder\IFunctionBuilder
*/
2017-03-26 14:45:49 -04:00
public function func () {
2021-01-03 09:28:31 -05:00
if ( $this -> connection -> getDatabasePlatform () instanceof OraclePlatform ) {
2022-01-04 02:50:10 -05:00
return new OCIFunctionBuilder ( $this -> connection , $this , $this -> helper );
2021-01-03 09:28:31 -05:00
}
if ( $this -> connection -> getDatabasePlatform () instanceof SqlitePlatform ) {
2022-01-04 02:50:10 -05:00
return new SqliteFunctionBuilder ( $this -> connection , $this , $this -> helper );
2021-01-03 09:28:31 -05:00
}
if ( $this -> connection -> getDatabasePlatform () instanceof PostgreSQL94Platform ) {
2022-01-04 02:50:10 -05:00
return new PgSqlFunctionBuilder ( $this -> connection , $this , $this -> helper );
2017-01-16 09:31:04 -05:00
}
2021-01-03 09:28:31 -05:00
2022-01-04 02:50:10 -05:00
return new FunctionBuilder ( $this -> connection , $this , $this -> helper );
2017-01-16 09:31:04 -05:00
}
2015-07-06 06:00:01 -04:00
/**
* Gets the type of the currently built query .
*
* @ return integer
*/
public function getType () {
return $this -> queryBuilder -> getType ();
}
/**
* Gets the associated DBAL Connection for this query builder .
*
* @ return \OCP\IDBConnection
*/
public function getConnection () {
return $this -> connection ;
}
/**
* Gets the state of this query builder instance .
*
* @ return integer Either QueryBuilder :: STATE_DIRTY or QueryBuilder :: STATE_CLEAN .
*/
public function getState () {
return $this -> queryBuilder -> getState ();
}
/**
* Executes 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 .
*
2021-01-03 09:28:31 -05:00
* @ return IResult | int
2015-07-06 06:00:01 -04:00
*/
public function execute () {
2016-10-28 07:48:58 -04:00
if ( $this -> systemConfig -> getValue ( 'log_query' , false )) {
2020-12-02 08:10:35 -05:00
try {
$params = [];
foreach ( $this -> getParameters () as $placeholder => $value ) {
if ( $value instanceof \DateTime ) {
$params [] = $placeholder . ' => DateTime:\'' . $value -> format ( 'c' ) . '\'' ;
} elseif ( is_array ( $value )) {
$params [] = $placeholder . ' => (\'' . implode ( '\', \'' , $value ) . '\')' ;
} else {
$params [] = $placeholder . ' => \'' . $value . '\'' ;
}
}
if ( empty ( $params )) {
$this -> logger -> debug ( 'DB QueryBuilder: \'{query}\'' , [
'query' => $this -> getSQL (),
'app' => 'core' ,
]);
2016-10-28 05:29:38 -04:00
} else {
2020-12-02 08:10:35 -05:00
$this -> logger -> debug ( 'DB QueryBuilder: \'{query}\' with parameters: {params}' , [
'query' => $this -> getSQL (),
'params' => implode ( ', ' , $params ),
'app' => 'core' ,
]);
2016-10-28 05:29:38 -04:00
}
2020-12-02 08:10:35 -05:00
} catch ( \Error $e ) {
// likely an error during conversion of $value to string
2022-03-22 07:38:50 -04:00
$this -> logger -> error ( 'DB QueryBuilder: error trying to log SQL query' , [ 'exception' => $e ]);
2016-10-28 05:29:38 -04:00
}
}
2020-12-10 04:22:21 -05:00
if ( ! empty ( $this -> getQueryPart ( 'select' ))) {
$select = $this -> getQueryPart ( 'select' );
$hasSelectAll = array_filter ( $select , static function ( $s ) {
return $s === '*' ;
});
$hasSelectSpecific = array_filter ( $select , static function ( $s ) {
return $s !== '*' ;
});
if ( empty ( $hasSelectAll ) === empty ( $hasSelectSpecific )) {
$exception = new QueryException ( 'Query is selecting * and specific values in the same query. This is not supported in Oracle.' );
2022-03-17 11:42:53 -04:00
$this -> logger -> error ( $exception -> getMessage (), [
2020-12-10 04:22:21 -05:00
'query' => $this -> getSQL (),
'app' => 'core' ,
2022-03-17 11:42:53 -04:00
'exception' => $exception ,
2020-12-10 04:22:21 -05:00
]);
}
}
2021-01-08 06:46:10 -05:00
$numberOfParameters = 0 ;
$hasTooLargeArrayParameter = false ;
foreach ( $this -> getParameters () as $parameter ) {
if ( is_array ( $parameter )) {
$count = count ( $parameter );
$numberOfParameters += $count ;
$hasTooLargeArrayParameter = $hasTooLargeArrayParameter || ( $count > 1000 );
}
}
if ( $hasTooLargeArrayParameter ) {
$exception = new QueryException ( 'More than 1000 expressions in a list are not allowed on Oracle.' );
2022-03-17 11:42:53 -04:00
$this -> logger -> error ( $exception -> getMessage (), [
2021-01-08 06:46:10 -05:00
'query' => $this -> getSQL (),
'app' => 'core' ,
2022-03-17 11:42:53 -04:00
'exception' => $exception ,
2021-01-08 06:46:10 -05:00
]);
}
if ( $numberOfParameters > 65535 ) {
$exception = new QueryException ( 'The number of parameters must not exceed 65535. Restriction by PostgreSQL.' );
2022-03-17 11:42:53 -04:00
$this -> logger -> error ( $exception -> getMessage (), [
2021-01-08 06:46:10 -05:00
'query' => $this -> getSQL (),
'app' => 'core' ,
2022-03-17 11:42:53 -04:00
'exception' => $exception ,
2021-01-08 06:46:10 -05:00
]);
}
2021-02-26 14:22:08 -05:00
2021-01-03 09:28:31 -05:00
$result = $this -> queryBuilder -> execute ();
if ( is_int ( $result )) {
return $result ;
}
return new ResultAdapter ( $result );
2015-07-06 06:00:01 -04:00
}
2020-10-24 05:51:32 -04:00
public function executeQuery () : IResult {
if ( $this -> getType () !== \Doctrine\DBAL\Query\QueryBuilder :: SELECT ) {
throw new \RuntimeException ( 'Invalid query type, expected SELECT query' );
}
try {
$result = $this -> execute ();
} catch ( \Doctrine\DBAL\Exception $e ) {
throw \OC\DB\Exceptions\DbalException :: wrap ( $e );
}
if ( $result instanceof IResult ) {
return $result ;
}
throw new \RuntimeException ( 'Invalid return type for query' );
}
2021-05-05 04:31:54 -04:00
/**
* Monkey - patched compatibility layer for apps that were adapted for Nextcloud 22 before
* the first beta , where executeStatement was named executeUpdate .
*
* Static analysis should catch those misuses , but until then let ' s try to keep things
* running .
*
* @ internal
* @ deprecated
* @ todo drop ASAP
*/
2020-10-24 05:51:32 -04:00
public function executeUpdate () : int {
2021-05-05 04:31:54 -04:00
return $this -> executeStatement ();
}
public function executeStatement () : int {
2020-10-24 05:51:32 -04:00
if ( $this -> getType () === \Doctrine\DBAL\Query\QueryBuilder :: SELECT ) {
2021-05-05 04:31:54 -04:00
throw new \RuntimeException ( 'Invalid query type, expected INSERT, DELETE or UPDATE statement' );
2020-10-24 05:51:32 -04:00
}
try {
$result = $this -> execute ();
} catch ( \Doctrine\DBAL\Exception $e ) {
throw \OC\DB\Exceptions\DbalException :: wrap ( $e );
}
if ( ! is_int ( $result )) {
2021-05-05 04:31:54 -04:00
throw new \RuntimeException ( 'Invalid return type for statement' );
2020-10-24 05:51:32 -04:00
}
return $result ;
}
2015-07-06 06:00:01 -04:00
/**
* Gets the complete SQL string formed by the current specifications of this QueryBuilder .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u' )
* -> from ( 'User' , 'u' )
* echo $qb -> getSQL (); // SELECT u FROM User u
* </ code >
*
* @ return string The SQL query string .
*/
public function getSQL () {
return $this -> queryBuilder -> getSQL ();
}
/**
* Sets a query parameter for the query being constructed .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u' )
* -> from ( 'users' , 'u' )
* -> where ( 'u.id = :user_id' )
* -> setParameter ( ':user_id' , 1 );
* </ code >
*
* @ param string | integer $key The parameter position or name .
* @ param mixed $value The parameter value .
2017-07-19 14:02:05 -04:00
* @ param string | null | int $type One of the IQueryBuilder :: PARAM_ * constants .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function setParameter ( $key , $value , $type = null ) {
$this -> queryBuilder -> setParameter ( $key , $value , $type );
return $this ;
}
/**
* Sets a collection of query parameters for the query being constructed .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u' )
* -> from ( 'users' , 'u' )
* -> where ( 'u.id = :user_id1 OR u.id = :user_id2' )
* -> setParameters ( array (
* ':user_id1' => 1 ,
* ':user_id2' => 2
* ));
* </ code >
*
* @ param array $params The query parameters to set .
* @ param array $types The query parameters types to set .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2020-03-26 04:30:18 -04:00
public function setParameters ( array $params , array $types = []) {
2015-07-06 06:00:01 -04:00
$this -> queryBuilder -> setParameters ( $params , $types );
return $this ;
}
/**
* Gets all defined query parameters for the query being constructed indexed by parameter index or name .
*
* @ return array The currently defined query parameters indexed by parameter index or name .
*/
public function getParameters () {
return $this -> queryBuilder -> getParameters ();
}
/**
* Gets a ( previously set ) query parameter of the query being constructed .
*
* @ param mixed $key The key ( index or name ) of the bound parameter .
*
* @ return mixed The value of the bound parameter .
*/
public function getParameter ( $key ) {
return $this -> queryBuilder -> getParameter ( $key );
}
/**
* Gets all defined query parameter types for the query being constructed indexed by parameter index or name .
*
* @ return array The currently defined query parameter types indexed by parameter index or name .
*/
public function getParameterTypes () {
return $this -> queryBuilder -> getParameterTypes ();
}
/**
* Gets a ( previously set ) query parameter type of the query being constructed .
*
* @ param mixed $key The key ( index or name ) of the bound parameter type .
*
* @ return mixed The value of the bound parameter type .
*/
public function getParameterType ( $key ) {
return $this -> queryBuilder -> getParameterType ( $key );
}
/**
* Sets the position of the first result to retrieve ( the " offset " ) .
*
2021-11-02 18:42:57 -04:00
* @ param int $firstResult The first result to return .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function setFirstResult ( $firstResult ) {
2021-11-02 18:42:57 -04:00
$this -> queryBuilder -> setFirstResult (( int ) $firstResult );
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Gets the position of the first result the query object was set to retrieve ( the " offset " ) .
2021-10-20 12:25:30 -04:00
* Returns 0 if { @ link setFirstResult } was not applied to this QueryBuilder .
2015-07-06 06:00:01 -04:00
*
2021-10-20 12:25:30 -04:00
* @ return int The position of the first result .
2015-07-06 06:00:01 -04:00
*/
public function getFirstResult () {
return $this -> queryBuilder -> getFirstResult ();
}
/**
* Sets the maximum number of results to retrieve ( the " limit " ) .
*
2015-07-21 03:56:08 -04:00
* NOTE : Setting max results to " 0 " will cause mixed behaviour . While most
* of the databases will just return an empty result set , Oracle will return
* all entries .
*
2021-11-02 18:42:57 -04:00
* @ param int | null $maxResults The maximum number of results to retrieve .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function setMaxResults ( $maxResults ) {
2021-11-02 18:42:57 -04:00
if ( $maxResults === null ) {
$this -> queryBuilder -> setMaxResults ( $maxResults );
} else {
$this -> queryBuilder -> setMaxResults (( int ) $maxResults );
}
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Gets the maximum number of results the query object was set to retrieve ( the " limit " ) .
* Returns NULL if { @ link setMaxResults } was not applied to this query builder .
*
2020-10-29 04:31:37 -04:00
* @ return int | null The maximum number of results .
2015-07-06 06:00:01 -04:00
*/
public function getMaxResults () {
return $this -> queryBuilder -> getMaxResults ();
}
/**
* Specifies an item that is to be returned in the query result .
* Replaces any previously specified selections , if any .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.id' , 'p.id' )
* -> from ( 'users' , 'u' )
* -> leftJoin ( 'u' , 'phonenumbers' , 'p' , 'u.id = p.user_id' );
* </ code >
*
2018-03-13 03:07:08 -04:00
* @ param mixed ... $selects The selection expressions .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* ' @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2018-03-13 03:07:08 -04:00
public function select ( ... $selects ) {
if ( count ( $selects ) === 1 && is_array ( $selects [ 0 ])) {
$selects = $selects [ 0 ];
}
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> select (
$this -> helper -> quoteColumnNames ( $selects )
);
2015-07-06 06:00:01 -04:00
return $this ;
}
2015-11-09 05:50:18 -05:00
/**
* Specifies an item that is to be returned with a different name in the query result .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> selectAlias ( 'u.id' , 'user_id' )
* -> from ( 'users' , 'u' )
* -> leftJoin ( 'u' , 'phonenumbers' , 'p' , 'u.id = p.user_id' );
* </ code >
*
* @ param mixed $select The selection expressions .
* @ param string $alias The column alias used in the constructed query .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-11-09 05:50:18 -05:00
*/
public function selectAlias ( $select , $alias ) {
$this -> queryBuilder -> addSelect (
$this -> helper -> quoteColumnName ( $select ) . ' AS ' . $this -> helper -> quoteColumnName ( $alias )
);
return $this ;
}
2015-12-08 03:49:21 -05:00
/**
* Specifies an item that is to be returned uniquely in the query result .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> selectDistinct ( 'type' )
* -> from ( 'users' );
* </ code >
*
* @ param mixed $select The selection expressions .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-12-08 03:49:21 -05:00
*/
public function selectDistinct ( $select ) {
2020-11-09 11:43:29 -05:00
if ( ! is_array ( $select )) {
$select = [ $select ];
}
$quotedSelect = $this -> helper -> quoteColumnNames ( $select );
2015-12-08 03:49:21 -05:00
$this -> queryBuilder -> addSelect (
2020-11-09 11:43:29 -05:00
'DISTINCT ' . implode ( ', ' , $quotedSelect )
2015-12-08 03:49:21 -05:00
);
return $this ;
}
2015-07-06 06:00:01 -04:00
/**
* Adds an item that is to be returned in the query result .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.id' )
* -> addSelect ( 'p.id' )
* -> from ( 'users' , 'u' )
* -> leftJoin ( 'u' , 'phonenumbers' , 'u.id = p.user_id' );
* </ code >
*
2018-03-13 04:25:32 -04:00
* @ param mixed ... $selects The selection expression .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2018-03-13 04:25:32 -04:00
public function addSelect ( ... $selects ) {
if ( count ( $selects ) === 1 && is_array ( $selects [ 0 ])) {
$selects = $selects [ 0 ];
}
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> addSelect (
$this -> helper -> quoteColumnNames ( $selects )
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Turns the query being built into a bulk delete query that ranges over
* a certain table .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> delete ( 'users' , 'u' )
* -> where ( 'u.id = :user_id' );
* -> setParameter ( ':user_id' , 1 );
* </ code >
*
* @ param string $delete The table whose rows are subject to the deletion .
* @ param string $alias The table alias used in the constructed query .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function delete ( $delete = null , $alias = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> delete (
2015-08-10 10:20:42 -04:00
$this -> getTableName ( $delete ),
2015-07-07 11:30:26 -04:00
$alias
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Turns the query being built into a bulk update query that ranges over
* a certain table
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> update ( 'users' , 'u' )
* -> set ( 'u.password' , md5 ( 'password' ))
* -> where ( 'u.id = ?' );
* </ code >
*
* @ param string $update The table whose rows are subject to the update .
* @ param string $alias The table alias used in the constructed query .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function update ( $update = null , $alias = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> update (
2015-08-10 10:20:42 -04:00
$this -> getTableName ( $update ),
2015-07-07 11:30:26 -04:00
$alias
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Turns the query being built into an insert query that inserts into
* a certain table
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> insert ( 'users' )
* -> values (
* array (
* 'name' => '?' ,
* 'password' => '?'
* )
* );
* </ code >
*
* @ param string $insert The table into which the rows should be inserted .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function insert ( $insert = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> insert (
2015-08-10 10:20:42 -04:00
$this -> getTableName ( $insert )
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
2015-12-09 05:09:02 -05:00
$this -> lastInsertedTable = $insert ;
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Creates and adds a query root corresponding to the table identified by the
* given alias , forming a cartesian product with any existing query roots .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.id' )
* -> from ( 'users' , 'u' )
* </ code >
*
2022-01-11 10:20:13 -05:00
* @ param string | IQueryFunction $from The table .
2015-07-06 06:00:01 -04:00
* @ param string | null $alias The alias of the table .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function from ( $from , $alias = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> from (
2015-08-10 10:20:42 -04:00
$this -> getTableName ( $from ),
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $alias )
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Creates and adds a join to the query .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.name' )
* -> from ( 'users' , 'u' )
* -> join ( 'u' , 'phonenumbers' , 'p' , 'p.is_primary = 1' );
* </ code >
*
* @ param string $fromAlias The alias that points to a from clause .
* @ param string $join The table name to join .
* @ param string $alias The alias of the join table .
2022-06-20 11:53:20 -04:00
* @ param string | ICompositeExpression | null $condition The condition for the join .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function join ( $fromAlias , $join , $alias , $condition = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> join (
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $fromAlias ),
2015-08-10 10:20:42 -04:00
$this -> getTableName ( $join ),
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $alias ),
2015-07-07 11:30:26 -04:00
$condition
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Creates and adds a join to the query .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.name' )
* -> from ( 'users' , 'u' )
* -> innerJoin ( 'u' , 'phonenumbers' , 'p' , 'p.is_primary = 1' );
* </ code >
*
* @ param string $fromAlias The alias that points to a from clause .
* @ param string $join The table name to join .
* @ param string $alias The alias of the join table .
2022-06-20 11:53:20 -04:00
* @ param string | ICompositeExpression | null $condition The condition for the join .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function innerJoin ( $fromAlias , $join , $alias , $condition = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> innerJoin (
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $fromAlias ),
2015-08-10 10:20:42 -04:00
$this -> getTableName ( $join ),
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $alias ),
2015-07-07 11:30:26 -04:00
$condition
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Creates and adds a left join to the query .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.name' )
* -> from ( 'users' , 'u' )
* -> leftJoin ( 'u' , 'phonenumbers' , 'p' , 'p.is_primary = 1' );
* </ code >
*
* @ param string $fromAlias The alias that points to a from clause .
* @ param string $join The table name to join .
* @ param string $alias The alias of the join table .
2022-06-20 11:53:20 -04:00
* @ param string | ICompositeExpression | null $condition The condition for the join .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function leftJoin ( $fromAlias , $join , $alias , $condition = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> leftJoin (
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $fromAlias ),
2015-08-10 10:20:42 -04:00
$this -> getTableName ( $join ),
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $alias ),
2015-07-07 11:30:26 -04:00
$condition
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Creates and adds a right join to the query .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.name' )
* -> from ( 'users' , 'u' )
* -> rightJoin ( 'u' , 'phonenumbers' , 'p' , 'p.is_primary = 1' );
* </ code >
*
* @ param string $fromAlias The alias that points to a from clause .
* @ param string $join The table name to join .
* @ param string $alias The alias of the join table .
2022-06-20 11:53:20 -04:00
* @ param string | ICompositeExpression | null $condition The condition for the join .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function rightJoin ( $fromAlias , $join , $alias , $condition = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> rightJoin (
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $fromAlias ),
2015-08-10 10:20:42 -04:00
$this -> getTableName ( $join ),
2017-07-20 14:14:31 -04:00
$this -> quoteAlias ( $alias ),
2015-07-07 11:30:26 -04:00
$condition
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Sets a new value for a column in a bulk update query .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> update ( 'users' , 'u' )
* -> set ( 'u.password' , md5 ( 'password' ))
* -> where ( 'u.id = ?' );
* </ code >
*
* @ param string $key The column to set .
2020-10-02 13:15:34 -04:00
* @ param ILiteral | IParameter | IQueryFunction | string $value The value , expression , placeholder , etc .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function set ( $key , $value ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> set (
$this -> helper -> quoteColumnName ( $key ),
$this -> helper -> quoteColumnName ( $value )
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Specifies one or more restrictions to the query result .
* Replaces any previously specified restrictions , if any .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.name' )
* -> from ( 'users' , 'u' )
* -> where ( 'u.id = ?' );
*
2022-07-27 08:51:42 -04:00
* // You can optionally programmatically build and/or expressions
2015-07-06 06:00:01 -04:00
* $qb = $conn -> getQueryBuilder ();
*
* $or = $qb -> expr () -> orx ();
* $or -> add ( $qb -> expr () -> eq ( 'u.id' , 1 ));
* $or -> add ( $qb -> expr () -> eq ( 'u.id' , 2 ));
*
* $qb -> update ( 'users' , 'u' )
* -> set ( 'u.password' , md5 ( 'password' ))
* -> where ( $or );
* </ code >
*
2018-03-13 04:27:11 -04:00
* @ param mixed ... $predicates The restriction predicates .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2018-03-13 04:27:11 -04:00
public function where ( ... $predicates ) {
2023-01-20 01:41:19 -05:00
if ( $this -> getQueryPart ( 'where' ) !== null && $this -> systemConfig -> getValue ( 'debug' , false )) {
// Only logging a warning, not throwing for now.
2023-11-13 07:11:26 -05:00
$e = new QueryException ( 'Using where() on non-empty WHERE part, please verify it is intentional to not call andWhere() or orWhere() instead. Otherwise consider creating a new query builder object or call resetQueryPart(\'where\') first.' );
2023-01-20 01:41:19 -05:00
$this -> logger -> warning ( $e -> getMessage (), [ 'exception' => $e ]);
}
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'where' ],
2018-03-13 04:27:11 -04:00
$predicates
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Adds one or more restrictions to the query results , forming a logical
* conjunction with any previously specified restrictions .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u' )
* -> from ( 'users' , 'u' )
* -> where ( 'u.username LIKE ?' )
* -> andWhere ( 'u.is_active = 1' );
* </ code >
*
2018-03-13 04:27:43 -04:00
* @ param mixed ... $where The query restrictions .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*
* @ see where ()
*/
2018-03-13 04:27:43 -04:00
public function andWhere ( ... $where ) {
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'andWhere' ],
2018-03-13 04:27:43 -04:00
$where
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Adds one or more restrictions to the query results , forming a logical
* disjunction with any previously specified restrictions .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.name' )
* -> from ( 'users' , 'u' )
* -> where ( 'u.id = 1' )
* -> orWhere ( 'u.id = 2' );
* </ code >
*
2018-03-13 04:28:27 -04:00
* @ param mixed ... $where The WHERE statement .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*
* @ see where ()
*/
2018-03-13 04:28:27 -04:00
public function orWhere ( ... $where ) {
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'orWhere' ],
2018-03-13 04:28:27 -04:00
$where
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Specifies a grouping over the results of the query .
* Replaces any previously specified groupings , if any .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.name' )
* -> from ( 'users' , 'u' )
* -> groupBy ( 'u.id' );
* </ code >
*
2018-03-13 04:29:36 -04:00
* @ param mixed ... $groupBys The grouping expression .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2018-03-13 04:29:36 -04:00
public function groupBy ( ... $groupBys ) {
if ( count ( $groupBys ) === 1 && is_array ( $groupBys [ 0 ])) {
2018-04-05 03:08:32 -04:00
$groupBys = $groupBys [ 0 ];
2018-03-13 04:29:36 -04:00
}
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'groupBy' ],
$this -> helper -> quoteColumnNames ( $groupBys )
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Adds a grouping expression to the query .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> select ( 'u.name' )
* -> from ( 'users' , 'u' )
* -> groupBy ( 'u.lastLogin' );
* -> addGroupBy ( 'u.createdAt' )
* </ code >
*
2018-03-13 04:30:14 -04:00
* @ param mixed ... $groupBy The grouping expression .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2018-03-13 04:30:14 -04:00
public function addGroupBy ( ... $groupBys ) {
if ( count ( $groupBys ) === 1 && is_array ( $groupBys [ 0 ])) {
$$groupBys = $groupBys [ 0 ];
}
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'addGroupBy' ],
$this -> helper -> quoteColumnNames ( $groupBys )
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Sets a value for a column in an insert query .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> insert ( 'users' )
* -> values (
* array (
* 'name' => '?'
* )
* )
* -> setValue ( 'password' , '?' );
* </ code >
*
* @ param string $column The column into which the value should be inserted .
2020-10-03 10:33:42 -04:00
* @ param IParameter | string $value The value that should be inserted into the column .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function setValue ( $column , $value ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> setValue (
$this -> helper -> quoteColumnName ( $column ),
2020-10-03 10:33:42 -04:00
( string ) $value
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Specifies values for an insert query indexed by column names .
* Replaces any previous values , if any .
*
* < code >
* $qb = $conn -> getQueryBuilder ()
* -> insert ( 'users' )
* -> values (
* array (
* 'name' => '?' ,
* 'password' => '?'
* )
* );
* </ code >
*
* @ param array $values The values to specify for the insert query indexed by column names .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function values ( array $values ) {
2015-07-07 11:30:26 -04:00
$quotedValues = [];
foreach ( $values as $key => $value ) {
$quotedValues [ $this -> helper -> quoteColumnName ( $key )] = $value ;
}
$this -> queryBuilder -> values ( $quotedValues );
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Specifies a restriction over the groups of the query .
* Replaces any previous having restrictions , if any .
*
2018-03-13 04:31:04 -04:00
* @ param mixed ... $having The restriction over the groups .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2018-03-13 04:31:04 -04:00
public function having ( ... $having ) {
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'having' ],
2018-03-13 04:31:04 -04:00
$having
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Adds a restriction over the groups of the query , forming a logical
* conjunction with any existing having restrictions .
*
2018-03-13 04:31:33 -04:00
* @ param mixed ... $having The restriction to append .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2018-03-13 04:31:33 -04:00
public function andHaving ( ... $having ) {
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'andHaving' ],
2018-03-13 04:31:33 -04:00
$having
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Adds a restriction over the groups of the query , forming a logical
* disjunction with any existing having restrictions .
*
2018-03-13 04:32:31 -04:00
* @ param mixed ... $having The restriction to add .
2015-07-06 06:00:01 -04:00
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
2018-03-13 04:32:31 -04:00
public function orHaving ( ... $having ) {
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'orHaving' ],
2018-03-13 04:32:31 -04:00
$having
2015-07-07 11:30:26 -04:00
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Specifies an ordering for the query results .
* Replaces any previously specified orderings , if any .
*
2022-05-13 06:59:51 -04:00
* @ param string | IQueryFunction | ILiteral | IParameter $sort The ordering expression .
2015-07-06 06:00:01 -04:00
* @ param string $order The ordering direction .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function orderBy ( $sort , $order = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> orderBy (
$this -> helper -> quoteColumnName ( $sort ),
$order
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Adds an ordering to the query results .
*
2022-04-22 07:31:34 -04:00
* @ param string | ILiteral | IParameter | IQueryFunction $sort The ordering expression .
2015-07-06 06:00:01 -04:00
* @ param string $order The ordering direction .
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function addOrderBy ( $sort , $order = null ) {
2015-07-07 11:30:26 -04:00
$this -> queryBuilder -> addOrderBy (
$this -> helper -> quoteColumnName ( $sort ),
$order
);
2015-07-06 06:00:01 -04:00
return $this ;
}
/**
* Gets a query part by its name .
*
* @ param string $queryPartName
*
* @ return mixed
*/
public function getQueryPart ( $queryPartName ) {
return $this -> queryBuilder -> getQueryPart ( $queryPartName );
}
/**
* Gets all query parts .
*
* @ return array
*/
public function getQueryParts () {
return $this -> queryBuilder -> getQueryParts ();
}
/**
* Resets SQL parts .
*
* @ param array | null $queryPartNames
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function resetQueryParts ( $queryPartNames = null ) {
$this -> queryBuilder -> resetQueryParts ( $queryPartNames );
return $this ;
}
/**
* Resets a single SQL part .
*
* @ param string $queryPartName
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2015-07-06 06:00:01 -04:00
*/
public function resetQueryPart ( $queryPartName ) {
$this -> queryBuilder -> resetQueryPart ( $queryPartName );
return $this ;
}
/**
* Creates a new named parameter and bind the value $value to it .
*
* This method provides a shortcut for PDOStatement :: bindValue
* when using prepared statements .
*
* The parameter $value specifies the value that you want to bind . If
* $placeholder is not provided bindValue () will automatically create a
* placeholder for you . An automatic placeholder will be of the name
* ':dcValue1' , ':dcValue2' etc .
*
2020-09-17 11:23:07 -04:00
* For more information see { @ link https :// www . php . net / pdostatement - bindparam }
2015-07-06 06:00:01 -04:00
*
* Example :
* < code >
* $value = 2 ;
* $q -> eq ( 'id' , $q -> bindValue ( $value ) );
* $stmt = $q -> executeQuery (); // executed with 'id = 2'
* </ code >
*
* @ license New BSD License
* @ link http :// www . zetacomponents . org
*
* @ param mixed $value
2023-10-18 01:09:08 -04:00
* @ param IQueryBuilder :: PARAM_ * $type
2015-07-06 06:00:01 -04:00
* @ param string $placeHolder The name to bind with . The string must start with a colon ':' .
*
2015-07-07 11:30:26 -04:00
* @ return IParameter the placeholder name used .
2015-07-06 06:00:01 -04:00
*/
2016-02-29 03:44:40 -05:00
public function createNamedParameter ( $value , $type = IQueryBuilder :: PARAM_STR , $placeHolder = null ) {
2015-07-07 11:30:26 -04:00
return new Parameter ( $this -> queryBuilder -> createNamedParameter ( $value , $type , $placeHolder ));
2015-07-06 06:00:01 -04:00
}
/**
* Creates 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 -> getQueryBuilder ();
* $qb -> select ( 'u.*' )
* -> from ( 'users' , 'u' )
2016-02-29 03:44:40 -05:00
* -> where ( 'u.username = ' . $qb -> createPositionalParameter ( 'Foo' , IQueryBuilder :: PARAM_STR ))
* -> orWhere ( 'u.username = ' . $qb -> createPositionalParameter ( 'Bar' , IQueryBuilder :: PARAM_STR ))
2015-07-06 06:00:01 -04:00
* </ code >
*
* @ param mixed $value
2023-10-18 01:09:08 -04:00
* @ param IQueryBuilder :: PARAM_ * $type
2015-07-06 06:00:01 -04:00
*
2015-07-07 11:30:26 -04:00
* @ return IParameter
2015-07-06 06:00:01 -04:00
*/
2016-02-29 03:44:40 -05:00
public function createPositionalParameter ( $value , $type = IQueryBuilder :: PARAM_STR ) {
2015-07-07 11:30:26 -04:00
return new Parameter ( $this -> queryBuilder -> createPositionalParameter ( $value , $type ));
}
/**
* Creates a new parameter
*
* Example :
* < code >
* $qb = $conn -> getQueryBuilder ();
* $qb -> select ( 'u.*' )
* -> from ( 'users' , 'u' )
* -> where ( 'u.username = ' . $qb -> createParameter ( 'name' ))
2016-02-29 03:44:40 -05:00
* -> setParameter ( 'name' , 'Bar' , IQueryBuilder :: PARAM_STR ))
2015-07-07 11:30:26 -04:00
* </ code >
*
* @ param string $name
*
* @ return IParameter
*/
public function createParameter ( $name ) {
return new Parameter ( ':' . $name );
}
/**
* Creates a new function
*
* Attention : Column names inside the call have to be quoted before hand
*
* Example :
* < code >
* $qb = $conn -> getQueryBuilder ();
* $qb -> select ( $qb -> createFunction ( 'COUNT(*)' ))
* -> from ( 'users' , 'u' )
* echo $qb -> getSQL (); // SELECT COUNT(*) FROM `users` u
* </ code >
* < code >
* $qb = $conn -> getQueryBuilder ();
* $qb -> select ( $qb -> createFunction ( 'COUNT(`column`)' ))
* -> from ( 'users' , 'u' )
* echo $qb -> getSQL (); // SELECT COUNT(`column`) FROM `users` u
* </ code >
*
* @ param string $call
*
* @ return IQueryFunction
*/
public function createFunction ( $call ) {
return new QueryFunction ( $call );
2015-07-06 06:00:01 -04:00
}
2015-08-10 10:20:42 -04:00
2015-12-08 03:40:20 -05:00
/**
* Used to get the id of the last inserted element
* @ return int
* @ throws \BadMethodCallException When being called before an insert query has been run .
*/
2021-03-04 08:44:04 -05:00
public function getLastInsertId () : int {
2015-12-09 05:09:02 -05:00
if ( $this -> getType () === \Doctrine\DBAL\Query\QueryBuilder :: INSERT && $this -> lastInsertedTable ) {
// lastInsertId() needs the prefix but no quotes
$table = $this -> prefixTableName ( $this -> lastInsertedTable );
2021-03-04 08:44:04 -05:00
return $this -> connection -> lastInsertId ( $table );
2015-12-08 03:40:20 -05:00
}
throw new \BadMethodCallException ( 'Invalid call to getLastInsertId without using insert() before.' );
}
2015-08-10 10:20:42 -04:00
/**
2015-12-08 03:57:38 -05:00
* Returns the table name quoted and with database prefix as needed by the implementation
*
2022-01-11 10:20:13 -05:00
* @ param string | IQueryFunction $table
2015-08-10 10:20:42 -04:00
* @ return string
*/
2015-12-08 03:57:38 -05:00
public function getTableName ( $table ) {
2019-04-16 05:43:12 -04:00
if ( $table instanceof IQueryFunction ) {
return ( string ) $table ;
}
2015-12-09 05:09:02 -05:00
$table = $this -> prefixTableName ( $table );
return $this -> helper -> quoteColumnName ( $table );
}
/**
* Returns the table name with database prefix as needed by the implementation
*
* @ param string $table
* @ return string
*/
protected function prefixTableName ( $table ) {
2023-05-15 07:47:19 -04:00
if ( $this -> automaticTablePrefix === false || str_starts_with ( $table , '*PREFIX*' )) {
2015-12-09 05:09:02 -05:00
return $table ;
2015-08-10 10:20:42 -04:00
}
2015-12-09 05:09:02 -05:00
return '*PREFIX*' . $table ;
2015-08-10 10:20:42 -04:00
}
2015-12-08 03:57:38 -05:00
/**
* Returns the column name quoted and with table alias prefix as needed by the implementation
*
* @ param string $column
* @ param string $tableAlias
* @ return string
*/
public function getColumnName ( $column , $tableAlias = '' ) {
if ( $tableAlias !== '' ) {
$tableAlias .= '.' ;
}
return $this -> helper -> quoteColumnName ( $tableAlias . $column );
}
2017-07-20 14:14:31 -04:00
/**
* Returns the column name quoted and with table alias prefix as needed by the implementation
*
* @ param string $alias
* @ return string
*/
public function quoteAlias ( $alias ) {
if ( $alias === '' || $alias === null ) {
return $alias ;
}
return $this -> helper -> quoteColumnName ( $alias );
}
2015-07-06 06:00:01 -04:00
}