2015-07-06 06:00:01 -04:00
< ? php
2024-05-23 03:26:56 -04:00
2015-07-06 06:00:01 -04:00
/**
2024-05-23 03:26:56 -04:00
* SPDX - FileCopyrightText : 2016 - 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX - FileCopyrightText : 2016 ownCloud , Inc .
* SPDX - License - Identifier : AGPL - 3.0 - only
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
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 ;
2024-07-04 11:18:22 -04:00
use OC\DB\Exceptions\DbalException ;
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 ;
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 ;
2024-07-04 11:18:22 -04:00
use OCP\IDBConnection ;
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 ;
2024-07-18 09:04:58 -04:00
private bool $nonEmptyWhere = false ;
2015-08-10 10:20:42 -04:00
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 () {
2024-07-01 10:59:47 -04:00
return match ( $this -> connection -> getDatabaseProvider ()) {
2024-07-04 05:26:17 -04:00
IDBConnection :: PLATFORM_ORACLE => new OCIExpressionBuilder ( $this -> connection , $this , $this -> logger ),
IDBConnection :: PLATFORM_POSTGRES => new PgSqlExpressionBuilder ( $this -> connection , $this , $this -> logger ),
IDBConnection :: PLATFORM_MYSQL => new MySqlExpressionBuilder ( $this -> connection , $this , $this -> logger ),
IDBConnection :: PLATFORM_SQLITE => new SqliteExpressionBuilder ( $this -> connection , $this , $this -> logger ),
2024-07-01 10:59:47 -04:00
};
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 () {
2024-07-01 10:59:47 -04:00
return match ( $this -> connection -> getDatabaseProvider ()) {
IDBConnection :: PLATFORM_ORACLE => new OCIFunctionBuilder ( $this -> connection , $this , $this -> helper ),
IDBConnection :: PLATFORM_POSTGRES => new PgSqlFunctionBuilder ( $this -> connection , $this , $this -> helper ),
IDBConnection :: PLATFORM_MYSQL => new FunctionBuilder ( $this -> connection , $this , $this -> helper ),
IDBConnection :: PLATFORM_SQLITE => new SqliteFunctionBuilder ( $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 .
*
2024-07-01 11:35:26 -04:00
* @ return int Always returns 0 which is former `QueryBuilder::STATE_DIRTY`
* @ deprecated 30.0 . 0 This function is going to be removed with the next Doctrine / DBAL update
* and we can not fix this in our wrapper .
2015-07-06 06:00:01 -04:00
*/
public function getState () {
2024-07-01 11:35:26 -04:00
$this -> logger -> debug ( IQueryBuilder :: class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.' , [ 'exception' => new \Exception ( 'Deprecated call to ' . __METHOD__ )]);
2015-07-06 06:00:01 -04:00
return $this -> queryBuilder -> getState ();
}
2024-07-04 11:18:22 -04:00
private function prepareForExecute () {
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
}
}
2024-07-18 09:04:58 -04: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.');
// $this->logger->error($exception->getMessage(), [
// 'query' => $this->getSQL(),
// 'app' => 'core',
// '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
]);
}
2024-07-04 11:18:22 -04:00
}
2021-02-26 14:22:08 -05:00
2024-07-04 11:18:22 -04:00
/**
* 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 .
*
* @ return IResult | int
*/
public function execute ( ? IDBConnection $connection = null ) {
try {
if ( $this -> getType () === \Doctrine\DBAL\Query\QueryBuilder :: SELECT ) {
return $this -> executeQuery ( $connection );
} else {
return $this -> executeStatement ( $connection );
}
} catch ( DBALException $e ) {
// `IQueryBuilder->execute` never wrapped the exception, but `executeQuery` and `executeStatement` do
/** @var \Doctrine\DBAL\Exception $previous */
$previous = $e -> getPrevious ();
2024-04-11 11:08:34 -04:00
2024-07-04 11:18:22 -04:00
throw $previous ;
2021-01-03 09:28:31 -05:00
}
2015-07-06 06:00:01 -04:00
}
2024-07-04 11:18:22 -04:00
public function executeQuery ( ? IDBConnection $connection = null ) : IResult {
2020-10-24 05:51:32 -04:00
if ( $this -> getType () !== \Doctrine\DBAL\Query\QueryBuilder :: SELECT ) {
throw new \RuntimeException ( 'Invalid query type, expected SELECT query' );
}
2024-07-04 11:18:22 -04:00
$this -> prepareForExecute ();
if ( ! $connection ) {
$connection = $this -> connection ;
2020-10-24 05:51:32 -04:00
}
2024-07-04 11:18:22 -04:00
return $connection -> executeQuery (
$this -> getSQL (),
$this -> getParameters (),
$this -> getParameterTypes (),
);
2020-10-24 05:51:32 -04:00
}
2024-07-04 11:18:22 -04:00
public function executeStatement ( ? IDBConnection $connection = null ) : 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
}
2024-07-04 11:18:22 -04:00
$this -> prepareForExecute ();
if ( ! $connection ) {
$connection = $this -> connection ;
2020-10-24 05:51:32 -04:00
}
2024-07-04 11:18:22 -04:00
return $connection -> executeStatement (
$this -> getSQL (),
$this -> getParameters (),
$this -> getParameterTypes (),
);
2020-10-24 05:51:32 -04:00
}
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 .
2024-07-01 10:49:42 -04:00
* @ since 30.0 . 0 Alias is deprecated and will no longer be used with the next Doctrine / DBAL update
2015-07-06 06:00:01 -04:00
*/
public function delete ( $delete = null , $alias = null ) {
2024-07-01 10:49:42 -04:00
if ( $alias !== null ) {
$this -> logger -> debug ( 'DELETE queries with alias are no longer supported and the provided alias is ignored' , [ 'exception' => new \InvalidArgumentException ( 'Table alias provided for DELETE query' )]);
}
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 .
2024-07-01 10:49:42 -04:00
* @ since 30.0 . 0 Alias is deprecated and will no longer be used with the next Doctrine / DBAL update
2015-07-06 06:00:01 -04:00
*/
public function update ( $update = null , $alias = null ) {
2024-07-01 10:49:42 -04:00
if ( $alias !== null ) {
$this -> logger -> debug ( 'UPDATE queries with alias are no longer supported and the provided alias is ignored' , [ 'exception' => new \InvalidArgumentException ( 'Table alias provided for UPDATE query' )]);
}
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 ();
*
2024-07-04 05:26:17 -04:00
* $or = $qb -> expr () -> orx (
* $qb -> expr () -> eq ( 'u.id' , 1 ),
* $qb -> expr () -> eq ( 'u.id' , 2 ),
* );
2015-07-06 06:00:01 -04:00
*
* $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 ) {
2024-07-18 09:04:58 -04:00
if ( $this -> nonEmptyWhere && $this -> systemConfig -> getValue ( 'debug' , false )) {
2023-01-20 01:41:19 -05:00
// 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 ]);
}
2024-07-18 09:04:58 -04:00
$this -> nonEmptyWhere = true ;
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 ) {
2024-07-18 09:04:58 -04:00
$this -> nonEmptyWhere = true ;
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 ) {
2024-07-18 09:04:58 -04:00
$this -> nonEmptyWhere = true ;
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
*/
2024-04-23 04:03:42 -04:00
public function addGroupBy ( ... $groupBy ) {
2015-07-07 11:30:26 -04:00
call_user_func_array (
[ $this -> queryBuilder , 'addGroupBy' ],
2024-04-23 04:03:42 -04:00
$this -> helper -> quoteColumnNames ( $groupBy )
2015-07-07 11:30:26 -04:00
);
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
2024-07-18 03:17:53 -04:00
* @ deprecated 30.0 . 0 This function is going to be removed with the next Doctrine / DBAL update
* and we can not fix this in our wrapper . Please track the details you need , outside the object .
2015-07-06 06:00:01 -04:00
*/
public function getQueryPart ( $queryPartName ) {
2024-07-18 03:17:53 -04:00
$this -> logger -> debug ( IQueryBuilder :: class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.' , [ 'exception' => new \Exception ( 'Deprecated call to ' . __METHOD__ )]);
2015-07-06 06:00:01 -04:00
return $this -> queryBuilder -> getQueryPart ( $queryPartName );
}
/**
* Gets all query parts .
*
* @ return array
2024-07-18 03:17:53 -04:00
* @ deprecated 30.0 . 0 This function is going to be removed with the next Doctrine / DBAL update
* and we can not fix this in our wrapper . Please track the details you need , outside the object .
2015-07-06 06:00:01 -04:00
*/
public function getQueryParts () {
2024-07-18 03:17:53 -04:00
$this -> logger -> debug ( IQueryBuilder :: class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.' , [ 'exception' => new \Exception ( 'Deprecated call to ' . __METHOD__ )]);
2015-07-06 06:00:01 -04:00
return $this -> queryBuilder -> getQueryParts ();
}
/**
* Resets SQL parts .
*
* @ param array | null $queryPartNames
*
2019-10-25 10:54:31 -04:00
* @ return $this This QueryBuilder instance .
2024-07-18 03:17:53 -04:00
* @ deprecated 30.0 . 0 This function is going to be removed with the next Doctrine / DBAL update
* and we can not fix this in our wrapper . Please create a new IQueryBuilder instead .
2015-07-06 06:00:01 -04:00
*/
public function resetQueryParts ( $queryPartNames = null ) {
2024-07-18 03:17:53 -04:00
$this -> logger -> debug ( IQueryBuilder :: class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.' , [ 'exception' => new \Exception ( 'Deprecated call to ' . __METHOD__ )]);
2015-07-06 06:00:01 -04:00
$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 .
2024-07-18 03:17:53 -04:00
* @ deprecated 30.0 . 0 This function is going to be removed with the next Doctrine / DBAL update
* and we can not fix this in our wrapper . Please create a new IQueryBuilder instead .
2015-07-06 06:00:01 -04:00
*/
public function resetQueryPart ( $queryPartName ) {
2024-07-18 03:17:53 -04:00
$this -> logger -> debug ( IQueryBuilder :: class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.' , [ 'exception' => new \Exception ( 'Deprecated call to ' . __METHOD__ )]);
2015-07-06 06:00:01 -04:00
$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 );
}
2024-02-14 10:04:35 -05:00
public function escapeLikeParameter ( string $parameter ) : string {
return $this -> connection -> escapeLikeParameter ( $parameter );
}
2015-07-06 06:00:01 -04:00
}