2008-09-23 06:47:11 +04:00
< ? php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL . For more information , see
2009-02-07 20:02:13 +03:00
* < http :// www . doctrine - project . org >.
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
namespace Doctrine\ORM ;
2009-01-22 22:38:10 +03:00
2010-03-29 17:20:41 +04:00
use Doctrine\DBAL\Types\Type ,
2011-10-24 01:28:23 +04:00
Doctrine\ORM\Query\QueryException ,
Doctrine\DBAL\Cache\QueryCacheProfile ;
2009-08-07 01:42:07 +04:00
2008-09-23 06:47:11 +04:00
/**
2010-03-29 17:20:41 +04:00
* Base contract for ORM queries . Base class for Query and NativeQuery .
2008-09-23 06:47:11 +04:00
*
2010-03-31 01:14:17 +04:00
* @ license http :// www . opensource . org / licenses / lgpl - license . php LGPL
* @ link www . doctrine - project . org
* @ since 2.0
* @ version $Revision $
* @ author Benjamin Eberlei < kontakt @ beberlei . de >
* @ author Guilherme Blanco < guilhermeblanco @ hotmail . com >
* @ author Jonathan Wage < jonwage @ gmail . com >
* @ author Roman Borschel < roman @ code - factory . org >
* @ author Konsta Vesterinen < kvesteri @ cc . hut . fi >
2008-09-23 06:47:11 +04:00
*/
2009-01-22 22:38:10 +03:00
abstract class AbstractQuery
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
/* Hydration mode constants */
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Hydrates an object graph . This is the default behavior .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
const HYDRATE_OBJECT = 1 ;
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Hydrates an array graph .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
const HYDRATE_ARRAY = 2 ;
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Hydrates a flat , rectangular result set with scalar values .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
const HYDRATE_SCALAR = 3 ;
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Hydrates a single scalar value .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
const HYDRATE_SINGLE_SCALAR = 4 ;
2010-03-29 17:20:41 +04:00
2011-03-15 21:48:04 +03:00
/**
* Very simple object hydrator ( optimized for performance ) .
*/
const HYDRATE_SIMPLEOBJECT = 5 ;
2008-09-23 06:47:11 +04:00
/**
2010-03-29 17:20:41 +04:00
* @ var array The parameter map of this query .
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
protected $_params = array ();
2008-09-23 06:47:11 +04:00
/**
2010-03-29 17:20:41 +04:00
* @ var array The parameter type map of this query .
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
protected $_paramTypes = array ();
2008-09-23 06:47:11 +04:00
/**
2010-03-29 17:20:41 +04:00
* @ var ResultSetMapping The user - specified ResultSetMapping to use .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
protected $_resultSetMapping ;
2008-09-23 06:47:11 +04:00
/**
2011-12-12 00:52:29 +04:00
* @ var \Doctrine\ORM\EntityManager The entity manager used by this query object .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
protected $_em ;
2008-09-23 06:47:11 +04:00
/**
2010-03-29 17:20:41 +04:00
* @ var array The map of query hints .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
protected $_hints = array ();
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* @ var integer The hydration mode .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
protected $_hydrationMode = self :: HYDRATE_OBJECT ;
2008-09-23 06:47:11 +04:00
/**
2011-10-24 01:28:23 +04:00
* @ param \Doctrine\DBAL\Cache\QueryCacheProfile
2009-10-24 04:28:43 +04:00
*/
2011-10-24 01:28:23 +04:00
protected $_queryCacheProfile ;
2009-10-23 02:39:37 +04:00
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* @ var boolean Boolean value that indicates whether or not expire the result cache .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
protected $_expireResultCache = false ;
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Initializes a new instance of a class derived from < tt > AbstractQuery </ tt >.
*
2011-12-12 00:52:29 +04:00
* @ param \Doctrine\ORM\EntityManager $entityManager
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
public function __construct ( EntityManager $em )
2008-09-23 06:47:11 +04:00
{
2010-03-29 17:20:41 +04:00
$this -> _em = $em ;
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Retrieves the associated EntityManager of this Query instance .
*
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\EntityManager
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function getEntityManager ()
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
return $this -> _em ;
2008-09-23 06:47:11 +04:00
}
/**
2009-05-03 14:58:16 +04:00
* Frees the resources used by the query object .
2010-08-27 23:28:26 +04:00
*
* Resets Parameters , Parameter Types and Query Hints .
*
* @ return void
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function free ()
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
$this -> _params = array ();
2010-08-27 23:28:26 +04:00
$this -> _paramTypes = array ();
$this -> _hints = array ();
2008-09-23 06:47:11 +04:00
}
/**
2010-02-09 20:13:49 +03:00
* Get all defined parameters .
2008-09-23 06:47:11 +04:00
*
2010-03-29 17:20:41 +04:00
* @ return array The defined query parameters .
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
public function getParameters ()
2008-09-23 06:47:11 +04:00
{
2009-06-14 21:34:28 +04:00
return $this -> _params ;
2008-09-23 06:47:11 +04:00
}
2011-12-01 19:00:26 +04:00
2011-08-28 20:48:15 +04:00
/**
* Get all defined parameter types .
*
* @ return array The defined query parameter types .
*/
public function getParameterTypes ()
{
return $this -> _paramTypes ;
}
2010-01-29 04:38:37 +03:00
2008-09-23 06:47:11 +04:00
/**
2009-06-14 21:34:28 +04:00
* Gets a query parameter .
2010-01-29 04:38:37 +03:00
*
2009-06-14 21:34:28 +04:00
* @ param mixed $key The key ( index or name ) of the bound parameter .
* @ return mixed The value of the bound parameter .
2008-09-23 06:47:11 +04:00
*/
2009-06-14 21:34:28 +04:00
public function getParameter ( $key )
2009-05-21 23:18:14 +04:00
{
2011-12-01 19:00:26 +04:00
if ( isset ( $this -> _params [ $key ])) {
return $this -> _params [ $key ];
}
return null ;
2008-09-23 06:47:11 +04:00
}
2011-08-28 20:48:15 +04:00
/**
* Gets a query parameter type .
*
* @ param mixed $key The key ( index or name ) of the bound parameter .
* @ return mixed The parameter type of the bound parameter .
*/
public function getParameterType ( $key )
{
2011-12-01 19:00:26 +04:00
if ( isset ( $this -> _paramTypes [ $key ])) {
return $this -> _paramTypes [ $key ];
}
return null ;
2011-08-28 20:48:15 +04:00
}
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Gets the SQL query that corresponds to this query object .
* The returned SQL syntax depends on the connection driver that is used
* by this query object at the time of this method call .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ return string SQL query
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
abstract public function getSQL ();
2010-01-29 04:38:37 +03:00
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Sets a query parameter .
2008-09-23 06:47:11 +04:00
*
2009-05-17 23:27:12 +04:00
* @ param string | integer $key The parameter position or name .
* @ param mixed $value The parameter value .
2010-03-29 17:20:41 +04:00
* @ param string $type The parameter type . If specified , the given value will be run through
* the type conversion of this type . This is usually not needed for
* strings and numeric types .
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery This query instance .
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
public function setParameter ( $key , $value , $type = null )
2008-09-23 06:47:11 +04:00
{
2011-08-15 08:53:56 +04:00
$key = trim ( $key , ':' );
2011-12-01 19:00:26 +04:00
2012-02-18 19:07:55 +04:00
$value = $this -> processParameterValue ( $value );
2011-05-13 06:05:45 +04:00
if ( $type === null ) {
$type = Query\ParameterTypeInferer :: inferType ( $value );
2010-03-29 17:20:41 +04:00
}
2011-12-01 19:00:26 +04:00
2011-05-13 06:05:45 +04:00
$this -> _paramTypes [ $key ] = $type ;
2009-04-12 23:02:12 +04:00
$this -> _params [ $key ] = $value ;
2011-12-01 19:00:26 +04:00
2009-11-21 16:13:19 +03:00
return $this ;
2008-09-23 06:47:11 +04:00
}
2010-01-29 04:38:37 +03:00
2012-02-18 19:07:55 +04:00
/**
* Process an individual parameter value
*
* @ param mixed $value
* @ return array
*/
private function processParameterValue ( $value )
{
switch ( true ) {
case is_array ( $value ) :
for ( $i = 0 , $l = count ( $value ); $i < $l ; $i ++ ) {
$paramValue = $this -> processParameterValue ( $value [ $i ]);
$value [ $i ] = is_array ( $paramValue ) ? $paramValue [ key ( $paramValue )] : $paramValue ;
}
return $value ;
case is_object ( $value ) && $this -> _em -> getMetadataFactory () -> hasMetadataFor ( get_class ( $value )) :
return $this -> convertObjectParameterToScalarValue ( $value );
default :
return $value ;
}
}
protected function convertObjectParameterToScalarValue ( $value )
{
$class = $this -> _em -> getClassMetadata ( get_class ( $value ));
if ( $class -> isIdentifierComposite ) {
throw new \InvalidArgumentException ( " Binding an entity with a composite primary key to a query is not supported. You should split the parameter into the explicit fields and bind them seperately. " );
}
if ( $this -> _em -> getUnitOfWork () -> getEntityState ( $value ) === UnitOfWork :: STATE_MANAGED ) {
$values = $this -> _em -> getUnitOfWork () -> getEntityIdentifier ( $value );
} else {
$values = $class -> getIdentifierValues ( $value );
}
$value = $values [ $class -> getSingleIdentifierFieldName ()];
if ( ! $value ) {
throw new \InvalidArgumentException ( " Binding entities to query parameters only allowed for entities that have an identifier. " );
}
return $value ;
}
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Sets a collection of query parameters .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ param array $params
2010-03-29 17:20:41 +04:00
* @ param array $types
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery This query instance .
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
public function setParameters ( array $params , array $types = array ())
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
foreach ( $params as $key => $value ) {
2011-12-01 19:00:26 +04:00
$this -> setParameter ( $key , $value , isset ( $types [ $key ]) ? $types [ $key ] : null );
2008-09-23 06:47:11 +04:00
}
2011-12-01 19:00:26 +04:00
2009-11-21 16:13:19 +03:00
return $this ;
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Sets the ResultSetMapping that should be used for hydration .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ param ResultSetMapping $rsm
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
public function setResultSetMapping ( Query\ResultSetMapping $rsm )
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
$this -> _resultSetMapping = $rsm ;
2011-12-01 19:00:26 +04:00
2009-11-21 16:13:19 +03:00
return $this ;
2008-09-23 06:47:11 +04:00
}
/**
2011-10-24 01:28:23 +04:00
* Defines a cache driver to be used for caching result sets and implictly enables caching .
2008-09-23 06:47:11 +04:00
*
2011-12-12 00:52:29 +04:00
* @ param \Doctrine\Common\Cache\Cache $driver Cache driver
* @ return \Doctrine\ORM\AbstractQuery
2008-09-23 06:47:11 +04:00
*/
2009-10-24 04:28:43 +04:00
public function setResultCacheDriver ( $resultCacheDriver = null )
2008-09-23 06:47:11 +04:00
{
2009-10-24 04:28:43 +04:00
if ( $resultCacheDriver !== null && ! ( $resultCacheDriver instanceof \Doctrine\Common\Cache\Cache )) {
2010-03-29 17:20:41 +04:00
throw ORMException :: invalidResultCacheDriver ();
2009-10-24 04:28:43 +04:00
}
2011-12-01 19:00:26 +04:00
$this -> _queryCacheProfile = $this -> _queryCacheProfile
? $this -> _queryCacheProfile -> setResultCacheDriver ( $resultCacheDriver )
: new QueryCacheProfile ( 0 , null , $resultCacheDriver );
2009-11-21 16:13:19 +03:00
return $this ;
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Returns the cache driver used for caching result sets .
2008-09-23 06:47:11 +04:00
*
2011-10-24 01:28:23 +04:00
* @ deprecated
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\Common\Cache\Cache Cache driver
2008-09-23 06:47:11 +04:00
*/
2009-05-21 23:18:14 +04:00
public function getResultCacheDriver ()
2008-09-23 06:47:11 +04:00
{
2011-10-24 01:28:23 +04:00
if ( $this -> _queryCacheProfile && $this -> _queryCacheProfile -> getResultCacheDriver ()) {
return $this -> _queryCacheProfile -> getResultCacheDriver ();
2008-09-23 06:47:11 +04:00
}
2011-12-01 19:00:26 +04:00
return $this -> _em -> getConfiguration () -> getResultCacheImpl ();
2008-09-23 06:47:11 +04:00
}
2009-10-24 04:28:43 +04:00
/**
2010-03-29 17:20:41 +04:00
* Set whether or not to cache the results of this query and if so , for
* how long and which ID to use for the cache entry .
2009-10-24 04:28:43 +04:00
*
* @ param boolean $bool
2011-10-24 01:28:23 +04:00
* @ param integer $lifetime
2010-03-29 17:20:41 +04:00
* @ param string $resultCacheId
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery This query instance .
2009-10-24 04:28:43 +04:00
*/
2011-10-24 01:28:23 +04:00
public function useResultCache ( $bool , $lifetime = null , $resultCacheId = null )
2009-10-24 04:28:43 +04:00
{
2011-10-24 01:28:23 +04:00
if ( $bool ) {
$this -> setResultCacheLifetime ( $lifetime );
$this -> setResultCacheId ( $resultCacheId );
2011-12-01 19:00:26 +04:00
return $this ;
2009-10-24 04:28:43 +04:00
}
2011-12-01 19:00:26 +04:00
$this -> _queryCacheProfile = null ;
2010-03-29 17:20:41 +04:00
return $this ;
2009-10-24 04:28:43 +04:00
}
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Defines how long the result cache will be active before expire .
2008-09-23 06:47:11 +04:00
*
2011-10-24 01:28:23 +04:00
* @ param integer $lifetime How long the cache entry is valid .
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery This query instance .
2008-09-23 06:47:11 +04:00
*/
2011-10-24 01:28:23 +04:00
public function setResultCacheLifetime ( $lifetime )
2008-09-23 06:47:11 +04:00
{
2011-12-01 19:00:26 +04:00
$lifetime = ( $lifetime !== null ) ? ( int ) $lifetime : 0 ;
$this -> _queryCacheProfile = $this -> _queryCacheProfile
? $this -> _queryCacheProfile -> setLifetime ( $lifetime )
2012-01-09 11:26:07 +04:00
: new QueryCacheProfile ( $lifetime , null , $this -> _em -> getConfiguration () -> getResultCacheImpl ());
2011-12-01 19:00:26 +04:00
2009-11-21 16:13:19 +03:00
return $this ;
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Retrieves the lifetime of resultset cache .
2008-09-23 06:47:11 +04:00
*
2011-10-24 01:28:23 +04:00
* @ deprecated
2010-03-29 17:20:41 +04:00
* @ return integer
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function getResultCacheLifetime ()
2008-09-23 06:47:11 +04:00
{
2011-10-24 01:28:23 +04:00
return $this -> _queryCacheProfile ? $this -> _queryCacheProfile -> getLifetime () : 0 ;
2008-09-23 06:47:11 +04:00
}
/**
2009-10-23 19:03:00 +04:00
* Defines if the result cache is active or not .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ param boolean $expire Whether or not to force resultset cache expiration .
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery This query instance .
2008-09-23 06:47:11 +04:00
*/
2009-11-21 16:13:19 +03:00
public function expireResultCache ( $expire = true )
2008-09-23 06:47:11 +04:00
{
2009-10-23 19:03:00 +04:00
$this -> _expireResultCache = $expire ;
2011-12-01 19:00:26 +04:00
2009-11-21 16:13:19 +03:00
return $this ;
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Retrieves if the resultset cache is active or not .
2008-09-23 06:47:11 +04:00
*
2010-03-29 17:20:41 +04:00
* @ return boolean
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function getExpireResultCache ()
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
return $this -> _expireResultCache ;
2008-09-23 06:47:11 +04:00
}
2011-10-24 01:28:23 +04:00
/**
* @ return QueryCacheProfile
*/
public function getQueryCacheProfile ()
{
return $this -> _queryCacheProfile ;
}
2011-03-17 00:51:32 +03:00
/**
* Change the default fetch mode of an association for this query .
*
* $fetchMode can be one of ClassMetadata :: FETCH_EAGER or ClassMetadata :: FETCH_LAZY
*
* @ param string $class
* @ param string $assocName
* @ param int $fetchMode
* @ return AbstractQuery
*/
public function setFetchMode ( $class , $assocName , $fetchMode )
{
if ( $fetchMode !== Mapping\ClassMetadata :: FETCH_EAGER ) {
$fetchMode = Mapping\ClassMetadata :: FETCH_LAZY ;
}
$this -> _hints [ 'fetchMode' ][ $class ][ $assocName ] = $fetchMode ;
2011-12-01 19:00:26 +04:00
2011-03-17 00:51:32 +03:00
return $this ;
}
2008-09-23 06:47:11 +04:00
/**
2010-03-29 17:20:41 +04:00
* Defines the processing mode to be used during hydration / result set transformation .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ param integer $hydrationMode Doctrine processing mode to be used during hydration process .
* One of the Query :: HYDRATE_ * constants .
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery This query instance .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function setHydrationMode ( $hydrationMode )
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
$this -> _hydrationMode = $hydrationMode ;
2011-12-01 19:00:26 +04:00
2009-11-21 16:13:19 +03:00
return $this ;
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Gets the hydration mode currently used by the query .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ return integer
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function getHydrationMode ()
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
return $this -> _hydrationMode ;
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Gets the list of results for the query .
2008-09-23 06:47:11 +04:00
*
2009-08-03 21:18:37 +04:00
* Alias for execute ( array (), $hydrationMode = HYDRATE_OBJECT ) .
2008-09-23 06:47:11 +04:00
*
2009-08-03 17:25:56 +04:00
* @ return array
2008-09-23 06:47:11 +04:00
*/
2009-08-03 21:18:37 +04:00
public function getResult ( $hydrationMode = self :: HYDRATE_OBJECT )
2008-09-23 06:47:11 +04:00
{
2009-08-03 21:18:37 +04:00
return $this -> execute ( array (), $hydrationMode );
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Gets the array of results for the query .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* Alias for execute ( array (), HYDRATE_ARRAY ) .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ return array
2008-09-23 06:47:11 +04:00
*/
2009-08-03 21:18:37 +04:00
public function getArrayResult ()
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
return $this -> execute ( array (), self :: HYDRATE_ARRAY );
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Gets the scalar results for the query .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* Alias for execute ( array (), HYDRATE_SCALAR ) .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ return array
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function getScalarResult ()
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
return $this -> execute ( array (), self :: HYDRATE_SCALAR );
2008-09-23 06:47:11 +04:00
}
2011-04-01 01:31:58 +04:00
/**
* Get exactly one result or null .
*
* @ throws NonUniqueResultException
* @ param int $hydrationMode
* @ return mixed
*/
2011-04-01 01:35:01 +04:00
public function getOneOrNullResult ( $hydrationMode = null )
2011-04-01 01:31:58 +04:00
{
$result = $this -> execute ( array (), $hydrationMode );
if ( $this -> _hydrationMode !== self :: HYDRATE_SINGLE_SCALAR && ! $result ) {
return null ;
}
2011-12-01 19:00:26 +04:00
if ( ! is_array ( $result )) {
return $result ;
}
if ( count ( $result ) > 1 ) {
throw new NonUniqueResultException ;
2011-04-01 01:31:58 +04:00
}
2011-12-01 19:00:26 +04:00
return array_shift ( $result );
2011-04-01 01:31:58 +04:00
}
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Gets the single result of the query .
2010-01-29 04:38:37 +03:00
*
2009-12-18 16:20:22 +03:00
* Enforces the presence as well as the uniqueness of the result .
2010-01-29 04:38:37 +03:00
*
2009-12-18 16:20:22 +03:00
* If the result is not unique , a NonUniqueResultException is thrown .
* If there is no result , a NoResultException is thrown .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ param integer $hydrationMode
* @ return mixed
2010-03-29 17:20:41 +04:00
* @ throws NonUniqueResultException If the query result is not unique .
* @ throws NoResultException If the query returned no result .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function getSingleResult ( $hydrationMode = null )
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
$result = $this -> execute ( array (), $hydrationMode );
2010-01-29 04:38:37 +03:00
2009-12-18 16:20:22 +03:00
if ( $this -> _hydrationMode !== self :: HYDRATE_SINGLE_SCALAR && ! $result ) {
2010-03-29 17:20:41 +04:00
throw new NoResultException ;
2009-12-18 16:20:22 +03:00
}
2010-01-29 04:38:37 +03:00
2011-12-01 19:00:26 +04:00
if ( ! is_array ( $result )) {
return $result ;
}
if ( count ( $result ) > 1 ) {
throw new NonUniqueResultException ;
2010-04-14 19:07:08 +04:00
}
2010-01-29 04:38:37 +03:00
2011-12-01 19:00:26 +04:00
return array_shift ( $result );
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Gets the single scalar result of the query .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* Alias for getSingleResult ( HYDRATE_SINGLE_SCALAR ) .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ return mixed
2010-03-29 17:20:41 +04:00
* @ throws QueryException If the query result is not unique .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function getSingleScalarResult ()
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
return $this -> getSingleResult ( self :: HYDRATE_SINGLE_SCALAR );
2008-09-23 06:47:11 +04:00
}
/**
2009-12-18 16:20:22 +03:00
* Sets a query hint . If the hint name is not recognized , it is silently ignored .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ param string $name The name of the hint .
* @ param mixed $value The value of the hint .
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function setHint ( $name , $value )
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
$this -> _hints [ $name ] = $value ;
2011-12-01 19:00:26 +04:00
2009-11-21 16:13:19 +03:00
return $this ;
2008-09-23 06:47:11 +04:00
}
/**
2009-12-18 16:20:22 +03:00
* Gets the value of a query hint . If the hint name is not recognized , FALSE is returned .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ param string $name The name of the hint .
2009-07-18 18:53:21 +04:00
* @ return mixed The value of the hint or FALSE , if the hint name is not recognized .
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function getHint ( $name )
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
return isset ( $this -> _hints [ $name ]) ? $this -> _hints [ $name ] : false ;
2008-09-23 06:47:11 +04:00
}
2011-01-23 18:47:07 +03:00
/**
* Return the key value map of query hints that are currently set .
2011-12-01 19:00:26 +04:00
*
2011-01-23 18:47:07 +03:00
* @ return array
*/
public function getHints ()
{
return $this -> _hints ;
}
2008-09-23 06:47:11 +04:00
/**
2009-04-12 23:02:12 +04:00
* Executes the query and returns an IterableResult that can be used to incrementally
2009-12-18 16:20:22 +03:00
* iterate over the result .
2008-09-23 06:47:11 +04:00
*
2009-04-12 23:02:12 +04:00
* @ param array $params The query parameters .
2009-07-18 18:53:21 +04:00
* @ param integer $hydrationMode The hydration mode to use .
2011-10-29 15:40:01 +04:00
* @ return \Doctrine\ORM\Internal\Hydration\IterableResult
2008-09-23 06:47:11 +04:00
*/
2011-03-20 14:19:01 +03:00
public function iterate ( array $params = array (), $hydrationMode = null )
2008-09-23 06:47:11 +04:00
{
2011-03-20 14:19:01 +03:00
if ( $hydrationMode !== null ) {
$this -> setHydrationMode ( $hydrationMode );
}
if ( $params ) {
$this -> setParameters ( $params );
}
$stmt = $this -> _doExecute ();
2010-02-09 22:58:04 +03:00
return $this -> _em -> newHydrator ( $this -> _hydrationMode ) -> iterate (
2011-03-20 14:19:01 +03:00
$stmt , $this -> _resultSetMapping , $this -> _hints
2009-04-12 23:02:12 +04:00
);
2008-09-23 06:47:11 +04:00
}
/**
2009-04-12 23:02:12 +04:00
* Executes the query .
2008-09-23 06:47:11 +04:00
*
2011-02-25 15:41:31 +03:00
* @ param array $params Any additional query parameters .
2009-05-03 14:58:16 +04:00
* @ param integer $hydrationMode Processing mode to be used during the hydration process .
2009-04-12 23:02:12 +04:00
* @ return mixed
2008-09-23 06:47:11 +04:00
*/
2009-04-12 23:02:12 +04:00
public function execute ( $params = array (), $hydrationMode = null )
2008-09-23 06:47:11 +04:00
{
2009-04-12 23:02:12 +04:00
if ( $hydrationMode !== null ) {
2010-02-25 18:47:20 +03:00
$this -> setHydrationMode ( $hydrationMode );
2009-04-12 23:02:12 +04:00
}
2010-01-29 04:38:37 +03:00
2010-03-29 17:20:41 +04:00
if ( $params ) {
$this -> setParameters ( $params );
}
2010-01-29 04:38:37 +03:00
2010-03-29 17:20:41 +04:00
$stmt = $this -> _doExecute ();
2008-09-23 06:47:11 +04:00
2009-07-21 13:25:14 +04:00
if ( is_numeric ( $stmt )) {
2009-04-12 23:02:12 +04:00
return $stmt ;
2008-09-23 06:47:11 +04:00
}
2009-07-21 13:25:14 +04:00
return $this -> _em -> getHydrator ( $this -> _hydrationMode ) -> hydrateAll (
2011-12-01 19:00:26 +04:00
$stmt , $this -> _resultSetMapping , $this -> _hints
);
2008-09-23 06:47:11 +04:00
}
2009-10-23 02:39:37 +04:00
/**
* Set the result cache id to use to store the result set cache entry .
2011-12-30 21:40:19 +04:00
* If this is not explicitly set by the developer then a hash is automatically
2009-10-23 02:39:37 +04:00
* generated for you .
*
2009-11-21 16:13:19 +03:00
* @ param string $id
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\ORM\AbstractQuery This query instance .
2009-10-23 02:39:37 +04:00
*/
public function setResultCacheId ( $id )
{
2011-12-01 19:00:26 +04:00
$this -> _queryCacheProfile = $this -> _queryCacheProfile
? $this -> _queryCacheProfile -> setCacheKey ( $id )
2012-01-09 11:26:07 +04:00
: new QueryCacheProfile ( 0 , $id , $this -> _em -> getConfiguration () -> getResultCacheImpl ());
2011-12-20 01:56:19 +04:00
2009-11-21 16:13:19 +03:00
return $this ;
2009-10-23 02:39:37 +04:00
}
/**
2011-10-24 01:28:23 +04:00
* Get the result cache id to use to store the result set cache entry if set .
2009-10-23 02:39:37 +04:00
*
2011-10-24 01:28:23 +04:00
* @ deprecated
* @ return string
2009-10-23 02:39:37 +04:00
*/
2011-10-24 01:28:23 +04:00
public function getResultCacheId ()
2009-10-23 02:39:37 +04:00
{
2011-10-24 01:28:23 +04:00
return $this -> _queryCacheProfile ? $this -> _queryCacheProfile -> getCacheKey () : null ;
2009-10-23 02:39:37 +04:00
}
2008-09-23 06:47:11 +04:00
/**
2010-03-29 17:20:41 +04:00
* Executes the query and returns a the resulting Statement object .
2010-01-29 04:38:37 +03:00
*
2011-12-12 00:52:29 +04:00
* @ return \Doctrine\DBAL\Driver\Statement The executed database statement that holds the results .
2008-09-23 06:47:11 +04:00
*/
2010-03-29 17:20:41 +04:00
abstract protected function _doExecute ();
2010-08-27 23:28:26 +04:00
/**
* Cleanup Query resource when clone is called .
*
* @ return void
*/
public function __clone ()
{
2010-08-30 22:30:11 +04:00
$this -> _params = array ();
$this -> _paramTypes = array ();
$this -> _hints = array ();
2010-08-27 23:28:26 +04:00
}
2008-09-23 06:47:11 +04:00
}