2008-05-17 20:04:56 +00: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
2012-05-26 14:37:00 +02:00
* and is licensed under the MIT license . For more information , see
2009-02-04 16:35:36 +00:00
* < http :// www . doctrine - project . org >.
2008-05-17 20:04:56 +00:00
*/
2009-01-22 19:38:10 +00:00
namespace Doctrine\ORM ;
2008-06-05 19:01:58 +00:00
2012-10-12 13:53:20 +02:00
use Exception ;
use Doctrine\Common\EventManager ;
use Doctrine\DBAL\Connection ;
2016-06-08 10:29:39 +03:00
use Doctrine\DBAL\DriverManager ;
2012-10-12 13:53:20 +02:00
use Doctrine\DBAL\LockMode ;
use Doctrine\ORM\Query\ResultSetMapping ;
use Doctrine\ORM\Proxy\ProxyFactory ;
use Doctrine\ORM\Query\FilterCollection ;
2012-10-19 23:18:01 -03:00
use Doctrine\Common\Util\ClassUtils ;
2008-06-05 19:01:58 +00:00
2008-05-17 20:04:56 +00:00
/**
2008-07-10 17:17:58 +00:00
* The EntityManager is the central access point to ORM functionality .
2008-05-17 20:04:56 +00:00
*
2013-05-09 10:23:12 +02:00
* It is a facade to all different ORM subsystems such as UnitOfWork ,
* Query Language and Repository API . Instantiation is done through
* the static create () method . The quickest way to obtain a fully
* configured EntityManager is :
*
* use Doctrine\ORM\Tools\Setup ;
* use Doctrine\ORM\EntityManager ;
*
* $paths = array ( '/path/to/entity/mapping/files' );
*
* $config = Setup :: createAnnotationMetadataConfiguration ( $paths );
* $dbParams = array ( 'driver' => 'pdo_sqlite' , 'memory' => true );
* $entityManager = EntityManager :: create ( $dbParams , $config );
*
* For more information see
* { @ link http :// docs . doctrine - project . org / projects / doctrine - orm / en / latest / reference / configuration . html }
*
* You should never attempt to inherit from the EntityManager : Inheritance
* is not a valid extension point for the EntityManager . Instead you
* should take a look at the { @ see \Doctrine\ORM\Decorator\EntityManagerDecorator }
* and wrap your entity manager in a decorator .
*
2010-03-30 21:14:17 +00:00
* @ since 2.0
* @ 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 >
2008-05-17 20:04:56 +00:00
*/
2012-11-26 01:03:46 +01:00
/* final */ class EntityManager implements EntityManagerInterface
2008-05-17 20:04:56 +00:00
{
2008-06-05 19:01:58 +00:00
/**
* The used Configuration .
*
2011-12-11 20:52:29 +00:00
* @ var \Doctrine\ORM\Configuration
2008-06-05 19:01:58 +00:00
*/
2010-07-08 00:20:54 +02:00
private $config ;
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
* The database connection used by the EntityManager .
*
2011-12-11 20:52:29 +00:00
* @ var \Doctrine\DBAL\Connection
2008-05-17 20:04:56 +00:00
*/
2010-07-08 00:20:54 +02:00
private $conn ;
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2009-02-07 17:02:13 +00:00
* The metadata factory , used to retrieve the ORM metadata of entity classes .
2008-05-17 20:04:56 +00:00
*
2011-12-11 20:52:29 +00:00
* @ var \Doctrine\ORM\Mapping\ClassMetadataFactory
2008-05-17 20:04:56 +00:00
*/
2010-07-08 00:20:54 +02:00
private $metadataFactory ;
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2009-01-13 21:56:43 +00:00
* The UnitOfWork used to coordinate object - level transactions .
2008-05-17 20:04:56 +00:00
*
2011-12-11 20:52:29 +00:00
* @ var \Doctrine\ORM\UnitOfWork
2008-05-17 20:04:56 +00:00
*/
2010-07-08 00:20:54 +02:00
private $unitOfWork ;
2010-02-21 23:26:42 +00:00
2008-05-30 12:09:24 +00:00
/**
* The event manager that is the central point of the event system .
*
2011-12-11 20:52:29 +00:00
* @ var \Doctrine\Common\EventManager
2008-05-30 12:09:24 +00:00
*/
2010-07-08 00:20:54 +02:00
private $eventManager ;
2009-01-04 16:15:32 +00:00
2009-05-11 10:43:27 +00:00
/**
2010-01-29 21:24:29 +00:00
* The proxy factory used to create dynamic proxies .
2009-05-11 10:43:27 +00:00
*
2011-12-11 20:52:29 +00:00
* @ var \Doctrine\ORM\Proxy\ProxyFactory
2009-05-11 10:43:27 +00:00
*/
2010-07-08 00:20:54 +02:00
private $proxyFactory ;
2010-02-21 23:26:42 +00:00
2013-06-13 21:47:40 -04:00
/**
* The repository factory used to create dynamic repositories .
*
* @ var \Doctrine\ORM\Repository\RepositoryFactory
*/
private $repositoryFactory ;
2010-02-09 17:13:49 +00:00
/**
2011-04-03 20:29:07 +02:00
* The expression builder instance used to generate query expressions .
*
2011-12-11 20:52:29 +00:00
* @ var \Doctrine\ORM\Query\Expr
2010-02-09 17:13:49 +00:00
*/
2010-07-08 00:20:54 +02:00
private $expressionBuilder ;
2009-05-11 10:43:27 +00:00
2009-02-04 16:35:36 +00:00
/**
* Whether the EntityManager is closed or not .
2011-04-03 20:29:07 +02:00
*
* @ var bool
2009-02-04 16:35:36 +00:00
*/
2010-07-08 00:20:54 +02:00
private $closed = false ;
2010-02-21 23:26:42 +00:00
2011-07-22 12:01:33 +02:00
/**
2011-09-15 21:34:51 +02:00
* Collection of query filters .
2011-07-22 12:01:33 +02:00
*
2012-09-21 03:20:06 +04:00
* @ var \Doctrine\ORM\Query\FilterCollection
2011-08-16 13:23:53 +02:00
*/
2011-09-15 21:34:51 +02:00
private $filterCollection ;
2011-08-16 13:23:53 +02:00
2013-02-13 20:42:13 -02:00
/**
* @ var \Doctrine\ORM\Cache The second level cache regions API .
*/
private $cache ;
2008-05-17 20:04:56 +00:00
/**
2009-01-04 16:15:32 +00:00
* Creates a new EntityManager that operates on the given database connection
* and uses the given Configuration and EventManager implementations .
2008-05-17 20:04:56 +00:00
*
2012-12-01 16:28:06 +00:00
* @ param \Doctrine\DBAL\Connection $conn
* @ param \Doctrine\ORM\Configuration $config
2011-12-11 20:52:29 +00:00
* @ param \Doctrine\Common\EventManager $eventManager
2008-05-17 20:04:56 +00:00
*/
2009-02-17 11:02:11 +00:00
protected function __construct ( Connection $conn , Configuration $config , EventManager $eventManager )
2008-05-17 20:04:56 +00:00
{
2013-06-13 21:47:40 -04:00
$this -> conn = $conn ;
$this -> config = $config ;
$this -> eventManager = $eventManager ;
2010-11-27 20:53:26 +01:00
$metadataFactoryClassName = $config -> getClassMetadataFactoryName ();
2012-03-15 01:13:14 -04:00
2010-11-27 20:53:26 +01:00
$this -> metadataFactory = new $metadataFactoryClassName ;
$this -> metadataFactory -> setEntityManager ( $this );
2010-07-08 00:20:54 +02:00
$this -> metadataFactory -> setCacheDriver ( $this -> config -> getMetadataCacheImpl ());
2011-10-16 17:00:33 +02:00
2013-06-13 23:53:53 -04:00
$this -> repositoryFactory = $config -> getRepositoryFactory ();
$this -> unitOfWork = new UnitOfWork ( $this );
$this -> proxyFactory = new ProxyFactory (
2011-12-01 10:00:26 -05:00
$this ,
$config -> getProxyDir (),
$config -> getProxyNamespace (),
$config -> getAutoGenerateProxyClasses ()
);
2013-02-13 20:42:13 -02:00
if ( $config -> isSecondLevelCacheEnabled ()) {
2014-04-17 15:16:46 -04:00
$cacheConfig = $config -> getSecondLevelCacheConfiguration ();
$cacheFactory = $cacheConfig -> getCacheFactory ();
$this -> cache = $cacheFactory -> createCache ( $this );
2013-02-13 20:42:13 -02:00
}
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-05-17 20:04:56 +00:00
*/
public function getConnection ()
{
2010-07-08 00:20:54 +02:00
return $this -> conn ;
2008-05-17 20:04:56 +00:00
}
2008-12-18 14:08:11 +00:00
2008-09-07 13:48:40 +00:00
/**
2008-12-18 14:08:11 +00:00
* Gets the metadata factory used to gather the metadata of classes .
2009-01-06 17:22:23 +00:00
*
2011-12-11 20:52:29 +00:00
* @ return \Doctrine\ORM\Mapping\ClassMetadataFactory
2008-09-07 13:48:40 +00:00
*/
2008-12-18 14:08:11 +00:00
public function getMetadataFactory ()
2008-09-07 13:48:40 +00:00
{
2010-07-08 00:20:54 +02:00
return $this -> metadataFactory ;
2008-09-07 13:48:40 +00:00
}
2010-02-21 23:26:42 +00:00
2010-02-09 17:13:49 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2010-02-09 17:13:49 +00:00
*/
public function getExpressionBuilder ()
{
2010-07-08 00:20:54 +02:00
if ( $this -> expressionBuilder === null ) {
$this -> expressionBuilder = new Query\Expr ;
2010-02-09 17:13:49 +00:00
}
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
return $this -> expressionBuilder ;
2010-02-09 17:13:49 +00:00
}
2010-02-21 23:26:42 +00:00
2008-07-10 17:17:58 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-08-01 18:46:14 +00:00
*/
public function beginTransaction ()
{
2010-07-08 00:20:54 +02:00
$this -> conn -> beginTransaction ();
2008-08-01 18:46:14 +00:00
}
2010-02-21 23:26:42 +00:00
2013-02-13 20:42:13 -02:00
/**
* { @ inheritDoc }
*/
public function getCache ()
{
return $this -> cache ;
}
2010-05-13 13:19:59 +02:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2010-05-13 13:19:59 +02:00
*/
2012-06-16 13:19:50 +02:00
public function transactional ( $func )
2010-05-13 13:19:59 +02:00
{
2012-06-16 13:19:50 +02:00
if ( ! is_callable ( $func )) {
throw new \InvalidArgumentException ( 'Expected argument of type "callable", got "' . gettype ( $func ) . '"' );
}
2010-07-08 00:20:54 +02:00
$this -> conn -> beginTransaction ();
2011-10-16 17:00:33 +02:00
2010-05-13 13:19:59 +02:00
try {
2012-06-16 13:19:50 +02:00
$return = call_user_func ( $func , $this );
2011-10-16 17:00:33 +02:00
2010-05-13 13:19:59 +02:00
$this -> flush ();
2010-07-08 00:20:54 +02:00
$this -> conn -> commit ();
2011-10-16 17:00:33 +02:00
2011-04-25 18:32:43 -03:00
return $return ? : true ;
2010-05-13 13:19:59 +02:00
} catch ( Exception $e ) {
$this -> close ();
2015-11-30 16:53:31 +00:00
$this -> conn -> rollBack ();
2011-10-16 17:00:33 +02:00
2010-05-13 13:19:59 +02:00
throw $e ;
}
}
2008-08-01 18:46:14 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-07-10 17:17:58 +00:00
*/
2008-08-01 18:46:14 +00:00
public function commit ()
2008-07-10 17:17:58 +00:00
{
2010-07-08 00:20:54 +02:00
$this -> conn -> commit ();
2009-05-28 11:13:12 +00:00
}
2010-02-21 23:26:42 +00:00
2009-05-28 11:13:12 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2009-05-28 11:13:12 +00:00
*/
public function rollback ()
{
2015-11-30 16:53:31 +00:00
$this -> conn -> rollBack ();
2008-07-10 17:17:58 +00:00
}
2008-05-17 20:04:56 +00:00
/**
2010-08-08 15:01:03 +02:00
* Returns the ORM metadata descriptor for a class .
*
* The class name must be the fully - qualified class name without a leading backslash
* ( as it is returned by get_class ( $obj )) or an aliased class name .
2011-10-16 17:00:33 +02:00
*
2010-08-08 15:01:03 +02:00
* Examples :
* MyProject\Domain\User
* sales : PriceRequest
2008-05-17 20:04:56 +00:00
*
2015-03-15 16:53:34 +01:00
* Internal note : Performance - sensitive method .
*
2012-12-13 17:56:25 +00:00
* @ param string $className
*
2011-12-11 20:52:29 +00:00
* @ return \Doctrine\ORM\Mapping\ClassMetadata
2008-05-17 20:04:56 +00:00
*/
public function getClassMetadata ( $className )
2009-12-15 21:06:32 +00:00
{
2010-07-08 00:20:54 +02:00
return $this -> metadataFactory -> getMetadataFor ( $className );
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-05-17 20:04:56 +00:00
*/
2012-11-26 01:03:46 +01:00
public function createQuery ( $dql = '' )
2008-05-17 20:04:56 +00:00
{
2009-01-22 19:38:10 +00:00
$query = new Query ( $this );
2011-12-01 10:00:26 -05:00
2008-05-17 20:04:56 +00:00
if ( ! empty ( $dql )) {
2016-07-05 12:48:00 -05:00
$query -> setDQL ( $dql );
2008-05-17 20:04:56 +00:00
}
2011-12-01 10:00:26 -05:00
2008-05-17 20:04:56 +00:00
return $query ;
}
2009-07-10 14:02:06 +00:00
2008-05-17 20:04:56 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-05-17 20:04:56 +00:00
*/
public function createNamedQuery ( $name )
{
2010-07-08 00:20:54 +02:00
return $this -> createQuery ( $this -> config -> getNamedQuery ( $name ));
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-05-17 20:04:56 +00:00
*/
2010-08-08 15:01:03 +02:00
public function createNativeQuery ( $sql , ResultSetMapping $rsm )
2008-05-17 20:04:56 +00:00
{
2009-04-12 19:02:12 +00:00
$query = new NativeQuery ( $this );
2012-03-15 01:13:14 -04:00
2016-07-05 12:48:00 -05:00
$query -> setSQL ( $sql );
2009-04-12 19:02:12 +00:00
$query -> setResultSetMapping ( $rsm );
2011-12-01 10:00:26 -05:00
2009-04-12 19:02:12 +00:00
return $query ;
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-05-17 20:04:56 +00:00
*/
public function createNamedNativeQuery ( $name )
{
2010-07-08 00:20:54 +02:00
list ( $sql , $rsm ) = $this -> config -> getNamedNativeQuery ( $name );
2011-12-01 10:00:26 -05:00
2009-08-11 10:51:38 +00:00
return $this -> createNativeQuery ( $sql , $rsm );
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-05-17 20:04:56 +00:00
*/
2009-06-22 18:48:42 +00:00
public function createQueryBuilder ()
2008-05-17 20:04:56 +00:00
{
2009-07-10 18:26:43 +00:00
return new QueryBuilder ( $this );
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
* Flushes all changes to objects that have been queued up to now to the database .
2009-01-13 21:56:43 +00:00
* This effectively synchronizes the in - memory state of managed objects with the
* database .
2010-05-10 23:51:56 +02:00
*
2011-10-23 10:05:46 +02:00
* If an entity is explicitly passed to this method only this entity and
* the cascade - persist semantics + scheduled inserts / removals are synchronized .
*
2013-02-21 17:27:55 -05:00
* @ param null | object | array $entity
2012-12-01 16:28:06 +00:00
*
2012-12-13 17:56:25 +00:00
* @ return void
*
2011-12-11 20:52:29 +00:00
* @ throws \Doctrine\ORM\OptimisticLockException If a version check on an entity that
2010-05-10 23:51:56 +02:00
* makes use of optimistic locking fails .
2016-02-15 15:15:32 +01:00
* @ throws ORMException
2008-05-17 20:04:56 +00:00
*/
2011-10-22 13:44:33 +02:00
public function flush ( $entity = null )
2008-05-17 20:04:56 +00:00
{
2010-07-08 00:20:54 +02:00
$this -> errorIfClosed ();
2011-12-01 10:00:26 -05:00
2011-10-22 13:44:33 +02:00
$this -> unitOfWork -> commit ( $entity );
2008-05-17 20:04:56 +00:00
}
2012-10-19 23:18:01 -03:00
2008-06-15 15:56:28 +00:00
/**
2008-07-10 17:17:58 +00:00
* Finds an Entity by its identifier .
2009-02-04 16:35:36 +00:00
*
2014-02-01 18:05:47 +01:00
* @ param string $entityName The class name of the entity to find .
* @ param mixed $id The identity of the entity to find .
* @ param integer | null $lockMode One of the \Doctrine\DBAL\LockMode ::* constants
* or NULL if no specific lock mode should be used
* during the search .
* @ param integer | null $lockVersion The version of the entity to find when using
* optimistic locking .
2012-07-23 00:52:41 -04:00
*
2013-02-12 11:49:44 +00:00
* @ return object | null The entity instance or NULL if the entity can not be found .
2012-12-01 16:28:06 +00:00
*
* @ throws OptimisticLockException
* @ throws ORMInvalidArgumentException
* @ throws TransactionRequiredException
* @ throws ORMException
2008-06-15 15:56:28 +00:00
*/
2014-02-01 18:05:47 +01:00
public function find ( $entityName , $id , $lockMode = null , $lockVersion = null )
2008-06-15 15:56:28 +00:00
{
2012-07-23 00:52:41 -04:00
$class = $this -> metadataFactory -> getMetadataFor ( ltrim ( $entityName , '\\' ));
2014-04-18 02:01:05 +00:00
if ( ! is_array ( $id )) {
if ( $class -> isIdentifierComposite ) {
throw ORMInvalidArgumentException :: invalidCompositeIdentifier ();
2012-10-19 23:18:01 -03:00
}
2012-07-23 00:52:41 -04:00
$id = array ( $class -> identifier [ 0 ] => $id );
}
2014-04-18 02:01:05 +00:00
foreach ( $id as $i => $value ) {
if ( is_object ( $value ) && $this -> metadataFactory -> hasMetadataFor ( ClassUtils :: getClass ( $value ))) {
$id [ $i ] = $this -> unitOfWork -> getSingleIdentifierValue ( $value );
if ( $id [ $i ] === null ) {
throw ORMInvalidArgumentException :: invalidIdentifierBindingEntity ();
}
}
}
2012-07-23 00:52:41 -04:00
$sortedId = array ();
foreach ( $class -> identifier as $identifier ) {
if ( ! isset ( $id [ $identifier ])) {
throw ORMException :: missingIdentifierField ( $class -> name , $identifier );
}
$sortedId [ $identifier ] = $id [ $identifier ];
2014-03-23 09:58:31 +01:00
unset ( $id [ $identifier ]);
}
if ( $id ) {
throw ORMException :: unrecognizedIdentifierFields ( $class -> name , array_keys ( $id ));
2012-07-23 00:52:41 -04:00
}
$unitOfWork = $this -> getUnitOfWork ();
// Check identity map first
if (( $entity = $unitOfWork -> tryGetById ( $sortedId , $class -> rootEntityName )) !== false ) {
if ( ! ( $entity instanceof $class -> name )) {
return null ;
}
2016-06-19 09:28:12 +02:00
switch ( true ) {
case LockMode :: OPTIMISTIC === $lockMode :
2012-07-23 00:52:41 -04:00
$this -> lock ( $entity , $lockMode , $lockVersion );
break ;
2016-06-19 09:28:12 +02:00
case LockMode :: NONE === $lockMode :
case LockMode :: PESSIMISTIC_READ === $lockMode :
case LockMode :: PESSIMISTIC_WRITE === $lockMode :
2012-07-23 00:52:41 -04:00
$persister = $unitOfWork -> getEntityPersister ( $class -> name );
$persister -> refresh ( $sortedId , $entity , $lockMode );
break ;
}
return $entity ; // Hit!
}
$persister = $unitOfWork -> getEntityPersister ( $class -> name );
2016-06-19 09:28:12 +02:00
switch ( true ) {
case LockMode :: OPTIMISTIC === $lockMode :
2012-07-23 00:52:41 -04:00
if ( ! $class -> isVersioned ) {
throw OptimisticLockException :: notVersioned ( $class -> name );
}
$entity = $persister -> load ( $sortedId );
$unitOfWork -> lock ( $entity , $lockMode , $lockVersion );
return $entity ;
2016-06-19 09:28:12 +02:00
case LockMode :: PESSIMISTIC_READ === $lockMode :
case LockMode :: PESSIMISTIC_WRITE === $lockMode :
2012-07-23 00:52:41 -04:00
if ( ! $this -> getConnection () -> isTransactionActive ()) {
throw TransactionRequiredException :: transactionRequired ();
}
return $persister -> load ( $sortedId , null , null , array (), $lockMode );
2014-02-01 18:05:47 +01:00
default :
return $persister -> loadById ( $sortedId );
2012-07-23 00:52:41 -04:00
}
2008-06-15 15:56:28 +00:00
}
2009-05-11 10:43:27 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2009-05-11 10:43:27 +00:00
*/
2011-12-01 21:18:39 +01:00
public function getReference ( $entityName , $id )
2009-05-11 10:43:27 +00:00
{
2010-08-08 15:01:03 +02:00
$class = $this -> metadataFactory -> getMetadataFor ( ltrim ( $entityName , '\\' ));
2012-03-15 01:13:14 -04:00
2011-12-01 21:18:39 +01:00
if ( ! is_array ( $id )) {
$id = array ( $class -> identifier [ 0 ] => $id );
}
2012-03-15 01:13:14 -04:00
2011-12-01 21:18:39 +01:00
$sortedId = array ();
2012-03-15 01:13:14 -04:00
2011-12-01 21:18:39 +01:00
foreach ( $class -> identifier as $identifier ) {
2012-03-15 01:13:14 -04:00
if ( ! isset ( $id [ $identifier ])) {
2011-12-01 21:18:39 +01:00
throw ORMException :: missingIdentifierField ( $class -> name , $identifier );
}
2012-03-15 01:13:14 -04:00
2011-12-01 21:18:39 +01:00
$sortedId [ $identifier ] = $id [ $identifier ];
2015-05-10 00:28:28 +02:00
unset ( $id [ $identifier ]);
}
if ( $id ) {
throw ORMException :: unrecognizedIdentifierFields ( $class -> name , array_keys ( $id ));
2011-12-01 21:18:39 +01:00
}
2010-02-21 23:26:42 +00:00
2009-10-07 12:39:46 +00:00
// Check identity map first, if its already in there just return it.
2012-03-15 01:13:14 -04:00
if (( $entity = $this -> unitOfWork -> tryGetById ( $sortedId , $class -> rootEntityName )) !== false ) {
2011-03-03 23:11:09 +01:00
return ( $entity instanceof $class -> name ) ? $entity : null ;
2009-10-07 12:39:46 +00:00
}
2011-12-01 10:00:26 -05:00
2010-10-11 20:11:23 +02:00
if ( $class -> subClasses ) {
2011-12-01 21:18:39 +01:00
return $this -> find ( $entityName , $sortedId );
2011-12-01 10:00:26 -05:00
}
2011-12-01 21:18:39 +01:00
$entity = $this -> proxyFactory -> getProxy ( $class -> name , $sortedId );
2012-03-15 01:13:14 -04:00
2011-12-01 21:18:39 +01:00
$this -> unitOfWork -> registerManaged ( $entity , $sortedId , array ());
2011-12-01 10:00:26 -05:00
2009-05-11 10:43:27 +00:00
return $entity ;
}
2010-02-21 23:26:42 +00:00
2010-07-20 14:20:13 +02:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2010-07-20 14:20:13 +02:00
*/
public function getPartialReference ( $entityName , $identifier )
{
2010-08-08 15:01:03 +02:00
$class = $this -> metadataFactory -> getMetadataFor ( ltrim ( $entityName , '\\' ));
2010-07-20 14:20:13 +02:00
// Check identity map first, if its already in there just return it.
2012-03-15 01:13:14 -04:00
if (( $entity = $this -> unitOfWork -> tryGetById ( $identifier , $class -> rootEntityName )) !== false ) {
2011-03-03 23:11:09 +01:00
return ( $entity instanceof $class -> name ) ? $entity : null ;
2010-07-20 14:20:13 +02:00
}
2011-12-01 10:00:26 -05:00
2010-07-20 14:20:13 +02:00
if ( ! is_array ( $identifier )) {
$identifier = array ( $class -> identifier [ 0 ] => $identifier );
}
$entity = $class -> newInstance ();
2012-03-15 01:13:14 -04:00
2010-07-20 14:20:13 +02:00
$class -> setIdentifierValues ( $entity , $identifier );
2012-03-15 01:13:14 -04:00
2010-07-20 14:20:13 +02:00
$this -> unitOfWork -> registerManaged ( $entity , $identifier , array ());
2011-10-15 11:52:41 +02:00
$this -> unitOfWork -> markReadOnly ( $entity );
2010-07-20 14:20:13 +02:00
return $entity ;
}
2008-05-17 20:04:56 +00:00
/**
2009-05-11 10:43:27 +00:00
* Clears the EntityManager . All entities that are currently managed
* by this EntityManager become detached .
*
2012-12-01 16:28:06 +00:00
* @ param string | null $entityName if given , only entities of this type will get detached
*
* @ return void
2008-05-17 20:04:56 +00:00
*/
public function clear ( $entityName = null )
{
2011-08-11 23:03:26 +02:00
$this -> unitOfWork -> clear ( $entityName );
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-05-17 20:04:56 +00:00
*/
public function close ()
{
2009-05-11 10:43:27 +00:00
$this -> clear ();
2012-03-15 01:13:14 -04:00
2010-07-08 00:20:54 +02:00
$this -> closed = true ;
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2009-07-19 16:54:53 +00:00
* Tells the EntityManager to make an instance managed and persistent .
2010-02-21 23:26:42 +00:00
*
2009-07-19 16:54:53 +00:00
* The entity will be entered into the database at or before transaction
* commit or as a result of the flush operation .
2011-10-16 17:00:33 +02:00
*
2010-03-15 17:19:00 +00:00
* NOTE : The persist operation always considers entities that are not yet known to
* this EntityManager as NEW . Do not pass detached entities to the persist operation .
2010-02-21 23:26:42 +00:00
*
2012-12-01 16:28:06 +00:00
* @ param object $entity The instance to make managed and persistent .
*
* @ return void
*
* @ throws ORMInvalidArgumentException
2016-02-15 15:15:32 +01:00
* @ throws ORMException
2008-05-17 20:04:56 +00:00
*/
2010-02-21 23:26:42 +00:00
public function persist ( $entity )
2008-05-17 20:04:56 +00:00
{
2010-02-21 23:26:42 +00:00
if ( ! is_object ( $entity )) {
2014-12-19 22:27:26 +01:00
throw ORMInvalidArgumentException :: invalidObject ( 'EntityManager#persist()' , $entity );
2010-02-21 23:26:42 +00:00
}
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
$this -> errorIfClosed ();
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
$this -> unitOfWork -> persist ( $entity );
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-17 20:04:56 +00:00
/**
2009-07-19 16:54:53 +00:00
* Removes an entity instance .
2010-02-21 23:26:42 +00:00
*
2009-07-19 16:54:53 +00:00
* A removed entity will be removed from the database at or before transaction commit
2010-02-21 23:26:42 +00:00
* or as a result of the flush operation .
*
2009-07-19 16:54:53 +00:00
* @ param object $entity The entity instance to remove .
2012-12-01 16:28:06 +00:00
*
* @ return void
*
* @ throws ORMInvalidArgumentException
2016-02-15 15:15:32 +01:00
* @ throws ORMException
2008-05-17 20:04:56 +00:00
*/
2009-07-19 16:54:53 +00:00
public function remove ( $entity )
2008-05-17 20:04:56 +00:00
{
2010-02-21 23:26:42 +00:00
if ( ! is_object ( $entity )) {
2014-12-19 22:27:26 +01:00
throw ORMInvalidArgumentException :: invalidObject ( 'EntityManager#remove()' , $entity );
2010-02-21 23:26:42 +00:00
}
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
$this -> errorIfClosed ();
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
$this -> unitOfWork -> remove ( $entity );
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-07-27 19:38:56 +00:00
/**
2009-07-19 16:54:53 +00:00
* Refreshes the persistent state of an entity from the database ,
2008-08-16 19:40:59 +00:00
* overriding any local changes that have not yet been persisted .
2008-07-27 19:38:56 +00:00
*
2009-07-21 15:53:58 +00:00
* @ param object $entity The entity to refresh .
2012-12-01 16:28:06 +00:00
*
* @ return void
*
* @ throws ORMInvalidArgumentException
2016-02-15 15:15:32 +01:00
* @ throws ORMException
2008-07-27 19:38:56 +00:00
*/
2009-02-04 16:35:36 +00:00
public function refresh ( $entity )
2008-07-27 19:38:56 +00:00
{
2010-02-21 23:26:42 +00:00
if ( ! is_object ( $entity )) {
2014-12-19 22:27:26 +01:00
throw ORMInvalidArgumentException :: invalidObject ( 'EntityManager#refresh()' , $entity );
2010-02-21 23:26:42 +00:00
}
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
$this -> errorIfClosed ();
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
$this -> unitOfWork -> refresh ( $entity );
2008-07-27 19:38:56 +00:00
}
2009-05-11 10:43:27 +00:00
/**
2009-07-25 16:33:29 +00:00
* Detaches an entity from the EntityManager , causing a managed entity to
* become detached . Unflushed changes made to the entity if any
* ( including removal of the entity ), will not be synchronized to the database .
2010-02-21 23:26:42 +00:00
* Entities which previously referenced the detached entity will continue to
2009-07-25 16:33:29 +00:00
* reference it .
2009-05-11 10:43:27 +00:00
*
* @ param object $entity The entity to detach .
2012-12-01 16:28:06 +00:00
*
* @ return void
*
* @ throws ORMInvalidArgumentException
2009-05-11 10:43:27 +00:00
*/
public function detach ( $entity )
{
2010-02-21 23:26:42 +00:00
if ( ! is_object ( $entity )) {
2014-12-19 22:27:26 +01:00
throw ORMInvalidArgumentException :: invalidObject ( 'EntityManager#detach()' , $entity );
2010-02-21 23:26:42 +00:00
}
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
$this -> unitOfWork -> detach ( $entity );
2009-05-11 10:43:27 +00:00
}
/**
* Merges the state of a detached entity into the persistence context
2009-07-25 16:33:29 +00:00
* of this EntityManager and returns the managed copy of the entity .
* The entity passed to merge will not become associated / managed with this EntityManager .
2009-05-11 10:43:27 +00:00
*
2009-07-25 16:33:29 +00:00
* @ param object $entity The detached entity to merge into the persistence context .
2012-12-01 16:28:06 +00:00
*
2009-05-11 10:43:27 +00:00
* @ return object The managed copy of the entity .
2012-12-01 16:28:06 +00:00
*
* @ throws ORMInvalidArgumentException
2016-02-15 15:15:32 +01:00
* @ throws ORMException
2009-05-11 10:43:27 +00:00
*/
public function merge ( $entity )
{
2010-02-21 23:26:42 +00:00
if ( ! is_object ( $entity )) {
2014-12-19 22:27:26 +01:00
throw ORMInvalidArgumentException :: invalidObject ( 'EntityManager#merge()' , $entity );
2010-02-21 23:26:42 +00:00
}
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
$this -> errorIfClosed ();
2011-12-01 10:00:26 -05:00
2010-07-08 00:20:54 +02:00
return $this -> unitOfWork -> merge ( $entity );
2009-05-11 10:43:27 +00:00
}
2010-02-21 23:26:42 +00:00
2008-07-27 19:38:56 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2012-12-01 16:28:06 +00:00
*
2010-04-23 00:51:32 -03:00
* @ todo Implementation need . This is necessary since $e2 = clone $e1 ; throws an E_FATAL when access anything on $e :
* Fatal error : Maximum function nesting level of '100' reached , aborting !
2008-07-27 19:38:56 +00:00
*/
2009-01-22 19:38:10 +00:00
public function copy ( $entity , $deep = false )
2008-07-27 19:38:56 +00:00
{
2010-01-29 21:36:05 +00:00
throw new \BadMethodCallException ( " Not implemented. " );
2008-07-27 19:38:56 +00:00
}
2009-02-17 08:01:34 +00:00
2010-04-08 22:50:06 +02:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2010-04-08 22:50:06 +02:00
*/
2010-04-11 16:43:33 +02:00
public function lock ( $entity , $lockMode , $lockVersion = null )
2010-04-08 22:50:06 +02:00
{
2010-07-08 00:20:54 +02:00
$this -> unitOfWork -> lock ( $entity , $lockMode , $lockVersion );
2010-04-08 22:50:06 +02:00
}
2008-05-17 20:04:56 +00:00
/**
2009-02-07 17:02:13 +00:00
* Gets the repository for an entity class .
2008-05-17 20:04:56 +00:00
*
2010-08-08 15:01:03 +02:00
* @ param string $entityName The name of the entity .
2012-12-01 16:28:06 +00:00
*
2013-06-13 21:47:40 -04:00
* @ return \Doctrine\ORM\EntityRepository The repository class .
2008-05-17 20:04:56 +00:00
*/
public function getRepository ( $entityName )
{
2013-06-13 23:53:53 -04:00
return $this -> repositoryFactory -> getRepository ( $this , $entityName );
2008-05-17 20:04:56 +00:00
}
2010-02-21 23:26:42 +00:00
2008-07-20 20:13:24 +00:00
/**
2009-07-19 16:54:53 +00:00
* Determines whether an entity instance is managed in this EntityManager .
2010-02-21 23:26:42 +00:00
*
2009-01-07 17:46:02 +00:00
* @ param object $entity
2012-12-01 16:28:06 +00:00
*
2009-07-30 15:16:02 +00:00
* @ return boolean TRUE if this EntityManager currently manages the given entity , FALSE otherwise .
2008-07-20 20:13:24 +00:00
*/
2009-01-07 17:46:02 +00:00
public function contains ( $entity )
2008-07-20 20:13:24 +00:00
{
2011-12-01 10:00:26 -05:00
return $this -> unitOfWork -> isScheduledForInsert ( $entity )
|| $this -> unitOfWork -> isInIdentityMap ( $entity )
&& ! $this -> unitOfWork -> isScheduledForDelete ( $entity );
2008-07-20 20:13:24 +00:00
}
2010-02-21 23:26:42 +00:00
2008-05-30 12:09:24 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-05-30 12:09:24 +00:00
*/
public function getEventManager ()
{
2010-07-08 00:20:54 +02:00
return $this -> eventManager ;
2008-05-30 12:09:24 +00:00
}
2010-02-21 23:26:42 +00:00
2008-06-05 19:01:58 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-06-05 19:01:58 +00:00
*/
2008-09-07 13:48:40 +00:00
public function getConfiguration ()
2008-06-05 19:01:58 +00:00
{
2010-07-08 00:20:54 +02:00
return $this -> config ;
2008-09-07 13:48:40 +00:00
}
2010-02-21 23:26:42 +00:00
2008-09-13 10:28:29 +00:00
/**
* Throws an exception if the EntityManager is closed or currently not active .
2008-12-18 14:08:11 +00:00
*
2012-12-01 16:28:06 +00:00
* @ return void
*
2009-12-18 13:20:22 +00:00
* @ throws ORMException If the EntityManager is closed .
2008-09-13 10:28:29 +00:00
*/
2010-07-08 00:20:54 +02:00
private function errorIfClosed ()
2008-09-07 13:48:40 +00:00
{
2010-07-08 00:20:54 +02:00
if ( $this -> closed ) {
2009-12-18 13:20:22 +00:00
throw ORMException :: entityManagerClosed ();
2008-09-07 13:48:40 +00:00
}
2008-06-05 19:01:58 +00:00
}
2010-02-21 23:26:42 +00:00
2010-12-03 17:44:24 +01:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2010-12-03 17:44:24 +01:00
*/
public function isOpen ()
{
return ( ! $this -> closed );
}
2008-06-05 19:01:58 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2008-06-05 19:01:58 +00:00
*/
2008-09-07 13:48:40 +00:00
public function getUnitOfWork ()
2008-06-05 19:01:58 +00:00
{
2010-07-08 00:20:54 +02:00
return $this -> unitOfWork ;
2008-06-05 19:01:58 +00:00
}
2010-02-21 23:26:42 +00:00
2013-07-29 10:46:47 -04:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2013-07-29 10:46:47 -04:00
*/
public function getHydrator ( $hydrationMode )
{
return $this -> newHydrator ( $hydrationMode );
}
2010-02-09 19:58:04 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2010-02-09 19:58:04 +00:00
*/
public function newHydrator ( $hydrationMode )
{
switch ( $hydrationMode ) {
case Query :: HYDRATE_OBJECT :
2011-12-01 10:00:26 -05:00
return new Internal\Hydration\ObjectHydrator ( $this );
2010-02-09 19:58:04 +00:00
case Query :: HYDRATE_ARRAY :
2011-12-01 10:00:26 -05:00
return new Internal\Hydration\ArrayHydrator ( $this );
2010-02-09 19:58:04 +00:00
case Query :: HYDRATE_SCALAR :
2011-12-01 10:00:26 -05:00
return new Internal\Hydration\ScalarHydrator ( $this );
2010-02-09 19:58:04 +00:00
case Query :: HYDRATE_SINGLE_SCALAR :
2011-12-01 10:00:26 -05:00
return new Internal\Hydration\SingleScalarHydrator ( $this );
2011-03-15 19:48:04 +01:00
case Query :: HYDRATE_SIMPLEOBJECT :
2011-12-01 10:00:26 -05:00
return new Internal\Hydration\SimpleObjectHydrator ( $this );
2010-02-09 19:58:04 +00:00
default :
2012-03-15 01:13:14 -04:00
if (( $class = $this -> config -> getCustomHydrationMode ( $hydrationMode )) !== null ) {
2011-12-01 10:00:26 -05:00
return new $class ( $this );
2010-06-02 23:25:09 -04:00
}
2010-02-09 19:58:04 +00:00
}
2010-03-08 21:03:04 +00:00
2011-12-01 10:00:26 -05:00
throw ORMException :: invalidHydrationMode ( $hydrationMode );
2010-02-09 19:58:04 +00:00
}
2009-01-13 21:56:43 +00:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2009-01-13 21:56:43 +00:00
*/
2009-07-20 12:05:19 +00:00
public function getProxyFactory ()
2009-01-13 21:56:43 +00:00
{
2010-07-08 00:20:54 +02:00
return $this -> proxyFactory ;
2009-05-13 15:19:27 +00:00
}
2010-02-21 23:26:42 +00:00
2011-10-16 17:00:33 +02:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2011-10-16 17:00:33 +02:00
*/
public function initializeObject ( $obj )
{
$this -> unitOfWork -> initializeObject ( $obj );
}
2008-08-31 18:27:16 +00:00
/**
2008-09-07 13:48:40 +00:00
* Factory method to create EntityManager instances .
2008-12-18 14:08:11 +00:00
*
2016-06-08 11:47:09 +03:00
* @ param array | Connection $connection An array with the connection parameters or an existing Connection instance .
2016-06-08 11:29:43 +03:00
* @ param Configuration $config The Configuration instance to use .
* @ param EventManager $eventManager The EventManager instance to use .
2012-12-01 16:28:06 +00:00
*
2008-12-18 14:08:11 +00:00
* @ return EntityManager The created EntityManager .
2012-12-01 16:28:06 +00:00
*
* @ throws \InvalidArgumentException
* @ throws ORMException
2008-09-07 13:48:40 +00:00
*/
2016-06-08 11:47:09 +03:00
public static function create ( $connection , Configuration $config , EventManager $eventManager = null )
2008-09-07 13:48:40 +00:00
{
2011-12-01 10:00:26 -05:00
if ( ! $config -> getMetadataDriverImpl ()) {
2010-04-11 10:51:31 +02:00
throw ORMException :: missingMappingDriverImpl ();
}
2009-08-13 10:13:06 +00:00
2016-06-08 11:47:09 +03:00
$connection = static :: createConnection ( $connection , $config , $eventManager );
2016-06-08 10:58:44 +03:00
2016-06-08 11:47:09 +03:00
return new EntityManager ( $connection , $config , $connection -> getEventManager ());
2016-06-08 10:58:44 +03:00
}
/**
* Factory method to create Connection instances .
*
2016-06-08 11:47:09 +03:00
* @ param array | Connection $connection An array with the connection parameters or an existing Connection instance .
2016-06-08 11:29:43 +03:00
* @ param Configuration $config The Configuration instance to use .
* @ param EventManager $eventManager The EventManager instance to use .
2016-06-08 10:58:44 +03:00
*
* @ return Connection
*
2016-06-08 11:29:43 +03:00
* @ throws \InvalidArgumentException
2016-06-08 12:24:41 +03:00
* @ throws ORMException
2016-06-08 10:58:44 +03:00
*/
2016-06-08 11:47:09 +03:00
protected static function createConnection ( $connection , Configuration $config , EventManager $eventManager = null )
2016-06-08 10:58:44 +03:00
{
2016-06-08 11:47:09 +03:00
if ( is_array ( $connection )) {
return DriverManager :: getConnection ( $connection , $config , $eventManager ? : new EventManager ());
2008-09-07 13:48:40 +00:00
}
2009-08-13 10:13:06 +00:00
2016-06-08 11:47:09 +03:00
if ( ! $connection instanceof Connection ) {
2016-11-17 17:23:22 +01:00
throw new \InvalidArgumentException ( sprintf ( 'Invalid argument for connection "%s".' , is_object ( $connection ) ? get_class ( $connection ) : gettype ( $connection ) . '#' . $connection ));
2016-06-08 11:47:09 +03:00
}
2016-06-08 12:24:41 +03:00
if ( $eventManager !== null && $connection -> getEventManager () !== $eventManager ) {
throw ORMException :: mismatchedEventManager ();
}
2016-06-08 11:47:09 +03:00
return $connection ;
2008-09-07 13:48:40 +00:00
}
2011-07-22 12:01:33 +02:00
2011-12-05 21:14:31 +01:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2011-12-05 21:14:31 +01:00
*/
2011-09-15 21:34:51 +02:00
public function getFilters ()
2011-07-22 12:01:33 +02:00
{
2011-12-05 23:00:52 +01:00
if ( null === $this -> filterCollection ) {
2011-09-15 21:34:51 +02:00
$this -> filterCollection = new FilterCollection ( $this );
2011-07-22 12:01:33 +02:00
}
2011-09-15 21:34:51 +02:00
return $this -> filterCollection ;
2011-07-22 12:01:33 +02:00
}
2011-08-16 13:23:53 +02:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2011-08-16 13:23:53 +02:00
*/
public function isFiltersStateClean ()
{
2012-03-15 01:13:14 -04:00
return null === $this -> filterCollection || $this -> filterCollection -> isClean ();
2011-08-16 13:23:53 +02:00
}
2011-12-05 21:14:31 +01:00
/**
2013-12-10 12:09:36 -02:00
* { @ inheritDoc }
2011-12-05 21:14:31 +01:00
*/
2011-09-15 21:34:51 +02:00
public function hasFilters ()
2011-08-16 13:23:53 +02:00
{
2011-09-15 21:34:51 +02:00
return null !== $this -> filterCollection ;
2011-08-16 13:23:53 +02:00
}
2009-07-16 13:29:15 +00:00
}