| Viewing file:  ORMQueryBuilderLoader.php (2.96 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?php
 /*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
 
 namespace Symfony\Bridge\Doctrine\Form\ChoiceList;
 
 use Symfony\Component\Form\Exception\UnexpectedTypeException;
 use Doctrine\ORM\QueryBuilder;
 use Doctrine\DBAL\Connection;
 use Doctrine\ORM\EntityManager;
 
 /**
 * Getting Entities through the ORM QueryBuilder
 */
 class ORMQueryBuilderLoader implements EntityLoaderInterface
 {
 /**
 * Contains the query builder that builds the query for fetching the
 * entities
 *
 * This property should only be accessed through queryBuilder.
 *
 * @var QueryBuilder
 */
 private $queryBuilder;
 
 /**
 * Construct an ORM Query Builder Loader
 *
 * @param QueryBuilder|\Closure $queryBuilder
 * @param EntityManager         $manager
 * @param string                $class
 *
 * @throws UnexpectedTypeException
 */
 public function __construct($queryBuilder, $manager = null, $class = null)
 {
 // If a query builder was passed, it must be a closure or QueryBuilder
 // instance
 if (!($queryBuilder instanceof QueryBuilder || $queryBuilder instanceof \Closure)) {
 throw new UnexpectedTypeException($queryBuilder, 'Doctrine\ORM\QueryBuilder or \Closure');
 }
 
 if ($queryBuilder instanceof \Closure) {
 if (!$manager instanceof EntityManager) {
 throw new UnexpectedTypeException($manager, 'Doctrine\ORM\EntityManager');
 }
 
 $queryBuilder = $queryBuilder($manager->getRepository($class));
 
 if (!$queryBuilder instanceof QueryBuilder) {
 throw new UnexpectedTypeException($queryBuilder, 'Doctrine\ORM\QueryBuilder');
 }
 }
 
 $this->queryBuilder = $queryBuilder;
 }
 
 /**
 * {@inheritDoc}
 */
 public function getEntities()
 {
 return $this->queryBuilder->getQuery()->execute();
 }
 
 /**
 * {@inheritDoc}
 */
 public function getEntitiesByIds($identifier, array $values)
 {
 $qb = clone ($this->queryBuilder);
 $alias = current($qb->getRootAliases());
 $parameter = 'ORMQueryBuilderLoader_getEntitiesByIds_'.$identifier;
 $where = $qb->expr()->in($alias.'.'.$identifier, ':'.$parameter);
 
 // Guess type
 $entity = current($qb->getRootEntities());
 $metadata = $qb->getEntityManager()->getClassMetadata($entity);
 if (in_array($metadata->getTypeOfField($identifier), array('integer', 'bigint', 'smallint'))) {
 $parameterType = Connection::PARAM_INT_ARRAY;
 } else {
 $parameterType = Connection::PARAM_STR_ARRAY;
 }
 
 return $qb->andWhere($where)
 ->getQuery()
 ->setParameter($parameter, $values, $parameterType)
 ->getResult();
 }
 }
 
 |