2008-09-23 06:47:11 +04:00
|
|
|
<?php
|
|
|
|
/*
|
|
|
|
* $Id: Abstract.php 1393 2008-03-06 17:49:16Z guilhermeblanco $
|
|
|
|
*
|
|
|
|
* 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,
|
|
|
|
Doctrine\ORM\Query\QueryException;
|
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
|
|
|
|
|
|
|
/**
|
2009-04-12 23:02:12 +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
|
|
|
|
|
|
|
/**
|
2009-04-12 23:02:12 +04:00
|
|
|
* The locally set cache driver used for caching result sets of this query.
|
2008-09-23 06:47:11 +04:00
|
|
|
*
|
2009-04-12 23:02:12 +04:00
|
|
|
* @var CacheDriver
|
2008-09-23 06:47:11 +04:00
|
|
|
*/
|
2009-10-24 04:28:43 +04:00
|
|
|
protected $_resultCacheDriver;
|
|
|
|
|
|
|
|
/**
|
2010-03-29 17:20:41 +04:00
|
|
|
* Boolean flag for whether or not to cache the results of this query.
|
2009-10-24 04:28:43 +04:00
|
|
|
*
|
|
|
|
* @var boolean
|
|
|
|
*/
|
|
|
|
protected $_useResultCache;
|
2008-09-23 06:47:11 +04:00
|
|
|
|
2009-10-23 02:39:37 +04:00
|
|
|
/**
|
2010-03-29 17:20:41 +04:00
|
|
|
* @var string The id to store the result cache entry under.
|
2009-10-23 02:39:37 +04:00
|
|
|
*/
|
|
|
|
protected $_resultCacheId;
|
|
|
|
|
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
|
|
|
/**
|
|
|
|
* @var int Result Cache lifetime.
|
|
|
|
*/
|
|
|
|
protected $_resultCacheTTL;
|
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>.
|
|
|
|
*
|
|
|
|
* @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.
|
|
|
|
*
|
|
|
|
* @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
|
|
|
}
|
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
|
|
|
{
|
2009-06-14 21:34:28 +04:00
|
|
|
return isset($this->_params[$key]) ? $this->_params[$key] : null;
|
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.
|
|
|
|
* @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
|
|
|
{
|
2010-03-29 17:20:41 +04:00
|
|
|
if ($type !== null) {
|
|
|
|
$this->_paramTypes[$key] = $type;
|
|
|
|
}
|
2009-04-12 23:02:12 +04:00
|
|
|
$this->_params[$key] = $value;
|
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
|
|
|
|
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
|
|
|
|
* @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) {
|
2010-03-29 17:20:41 +04:00
|
|
|
if (isset($types[$key])) {
|
|
|
|
$this->setParameter($key, $value, $types[$key]);
|
|
|
|
} else {
|
|
|
|
$this->setParameter($key, $value);
|
|
|
|
}
|
2008-09-23 06:47:11 +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
|
2009-11-21 16:13:19 +03: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;
|
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
|
|
|
* Defines a cache driver to be used for caching result sets.
|
2008-09-23 06:47:11 +04:00
|
|
|
*
|
2009-07-07 00:34:54 +04:00
|
|
|
* @param Doctrine\Common\Cache\Cache $driver Cache driver
|
2010-03-29 17:20:41 +04:00
|
|
|
* @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
|
|
|
}
|
|
|
|
$this->_resultCacheDriver = $resultCacheDriver;
|
|
|
|
if ($resultCacheDriver) {
|
|
|
|
$this->_useResultCache = true;
|
2008-09-23 06:47:11 +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
|
|
|
* Returns the cache driver used for caching result sets.
|
2008-09-23 06:47:11 +04:00
|
|
|
*
|
2009-07-07 00:34:54 +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
|
|
|
{
|
2009-10-24 04:28:43 +04:00
|
|
|
if ($this->_resultCacheDriver) {
|
|
|
|
return $this->_resultCacheDriver;
|
2008-09-23 06:47:11 +04:00
|
|
|
} else {
|
2009-04-12 23:02:12 +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
|
2010-03-29 17:20:41 +04:00
|
|
|
* @param integer $timeToLive
|
|
|
|
* @param string $resultCacheId
|
|
|
|
* @return This query instance.
|
2009-10-24 04:28:43 +04:00
|
|
|
*/
|
|
|
|
public function useResultCache($bool, $timeToLive = null, $resultCacheId = null)
|
|
|
|
{
|
|
|
|
$this->_useResultCache = $bool;
|
|
|
|
if ($timeToLive) {
|
|
|
|
$this->setResultCacheLifetime($timeToLive);
|
|
|
|
}
|
|
|
|
if ($resultCacheId) {
|
|
|
|
$this->_resultCacheId = $resultCacheId;
|
|
|
|
}
|
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
|
|
|
*
|
2010-03-29 17:20:41 +04:00
|
|
|
* @param integer $timeToLive How long the cache entry is valid.
|
|
|
|
* @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 setResultCacheLifetime($timeToLive)
|
2008-09-23 06:47:11 +04:00
|
|
|
{
|
2009-04-12 23:02:12 +04:00
|
|
|
if ($timeToLive !== null) {
|
|
|
|
$timeToLive = (int) $timeToLive;
|
2008-09-23 06:47:11 +04:00
|
|
|
}
|
|
|
|
|
2009-04-12 23:02:12 +04:00
|
|
|
$this->_resultCacheTTL = $timeToLive;
|
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
|
|
|
*
|
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
|
|
|
{
|
2009-04-12 23:02:12 +04:00
|
|
|
return $this->_resultCacheTTL;
|
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.
|
2010-03-29 17:20:41 +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;
|
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-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;
|
|
|
|
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.
|
2010-03-29 17:20:41 +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;
|
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
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
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
|
|
|
|
2009-04-12 23:02:12 +04:00
|
|
|
if (is_array($result)) {
|
|
|
|
if (count($result) > 1) {
|
2010-03-29 17:20:41 +04:00
|
|
|
throw new NonUniqueResultException;
|
2009-04-12 23:02:12 +04:00
|
|
|
}
|
|
|
|
return array_shift($result);
|
2010-04-14 19:07:08 +04:00
|
|
|
}
|
2010-01-29 04:38:37 +03:00
|
|
|
|
2009-04-12 23:02:12 +04:00
|
|
|
return $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.
|
2010-03-29 17:20:41 +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;
|
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.
|
|
|
|
*
|
|
|
|
* @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.
|
2009-04-12 23:02:12 +04:00
|
|
|
* @return 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
|
|
|
if (isset($this->_params[0])) {
|
2009-10-28 14:29:29 +03:00
|
|
|
throw QueryException::invalidParameterPosition(0);
|
|
|
|
}
|
2008-09-23 06:47:11 +04:00
|
|
|
|
2009-05-21 23:18:14 +04:00
|
|
|
// Check result cache
|
2009-10-24 04:28:43 +04:00
|
|
|
if ($this->_useResultCache && $cacheDriver = $this->getResultCacheDriver()) {
|
2011-02-26 02:38:06 +03:00
|
|
|
list($key, $hash) = $this->getResultCacheId();
|
|
|
|
$cached = $this->_expireResultCache ? false : $cacheDriver->fetch($hash);
|
2008-09-23 06:47:11 +04:00
|
|
|
|
2011-02-26 02:38:06 +03:00
|
|
|
if ($cached === false || !isset($cached[$key])) {
|
2009-04-12 23:02:12 +04:00
|
|
|
// Cache miss.
|
2010-03-29 17:20:41 +04:00
|
|
|
$stmt = $this->_doExecute();
|
2010-01-29 04:38:37 +03:00
|
|
|
|
2009-07-21 14:48:19 +04:00
|
|
|
$result = $this->_em->getHydrator($this->_hydrationMode)->hydrateAll(
|
|
|
|
$stmt, $this->_resultSetMapping, $this->_hints
|
|
|
|
);
|
2010-01-29 04:38:37 +03:00
|
|
|
|
2011-02-26 02:38:06 +03:00
|
|
|
$cacheDriver->save($hash, array($key => $result), $this->_resultCacheTTL);
|
2008-09-23 06:47:11 +04:00
|
|
|
|
2009-04-12 23:02:12 +04:00
|
|
|
return $result;
|
|
|
|
} else {
|
|
|
|
// Cache hit.
|
2011-02-26 02:38:06 +03:00
|
|
|
return $cached[$key];
|
2009-04-12 23:02:12 +04:00
|
|
|
}
|
2008-09-23 06:47:11 +04: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(
|
|
|
|
$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.
|
|
|
|
* If this is not explicitely set by the developer then a hash is automatically
|
|
|
|
* generated for you.
|
|
|
|
*
|
2009-11-21 16:13:19 +03:00
|
|
|
* @param string $id
|
2010-03-29 17:20:41 +04:00
|
|
|
* @return Doctrine\ORM\AbstractQuery This query instance.
|
2009-10-23 02:39:37 +04:00
|
|
|
*/
|
|
|
|
public function setResultCacheId($id)
|
|
|
|
{
|
|
|
|
$this->_resultCacheId = $id;
|
2009-11-21 16:13:19 +03:00
|
|
|
return $this;
|
2009-10-23 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the result cache id to use to store the result set cache entry.
|
|
|
|
* Will return the configured id if it exists otherwise a hash will be
|
|
|
|
* automatically generated for you.
|
|
|
|
*
|
2011-02-26 02:38:06 +03:00
|
|
|
* @return array ($key, $hash)
|
2009-10-23 02:39:37 +04:00
|
|
|
*/
|
2011-01-23 22:53:20 +03:00
|
|
|
protected function getResultCacheId()
|
2009-10-23 02:39:37 +04:00
|
|
|
{
|
|
|
|
if ($this->_resultCacheId) {
|
2011-01-23 22:53:20 +03:00
|
|
|
return array($this->_resultCacheId, $this->_resultCacheId);
|
2009-10-23 02:39:37 +04:00
|
|
|
} else {
|
2010-12-03 19:34:56 +03:00
|
|
|
$params = $this->_params;
|
|
|
|
foreach ($params AS $key => $value) {
|
|
|
|
if (is_object($value) && $this->_em->getMetadataFactory()->hasMetadataFor(get_class($value))) {
|
|
|
|
if ($this->_em->getUnitOfWork()->getEntityState($value) == UnitOfWork::STATE_MANAGED) {
|
|
|
|
$idValues = $this->_em->getUnitOfWork()->getEntityIdentifier($value);
|
|
|
|
} else {
|
|
|
|
$class = $this->_em->getClassMetadata(get_class($value));
|
|
|
|
$idValues = $class->getIdentifierValues($value);
|
|
|
|
}
|
|
|
|
$params[$key] = $idValues;
|
2011-01-23 22:53:20 +03:00
|
|
|
} else {
|
|
|
|
$params[$key] = $value;
|
2010-12-03 19:34:56 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-02-10 22:09:25 +03:00
|
|
|
$sql = $this->getSql();
|
|
|
|
ksort($this->_hints);
|
2011-01-23 22:53:20 +03:00
|
|
|
$key = implode(";", (array)$sql) . var_export($params, true) .
|
|
|
|
var_export($this->_hints, true)."&hydrationMode=".$this->_hydrationMode;
|
|
|
|
return array($key, md5($key));
|
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
|
|
|
*
|
2010-03-29 17:20:41 +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
|
|
|
}
|