src/Cms/CoreBundle/Util/Doctrine/EntityRepository.php line 112

Open in your IDE?
  1. <?php
  2. namespace Cms\CoreBundle\Util\Doctrine;
  3. use App\Util\Querying;
  4. use Cms\ContainerBundle\Entity\Container;
  5. use Cms\CoreBundle\Doctrine\Hydrators\SingleColumnHydrator;
  6. use Cms\CoreBundle\Model\Interfaces\Identifiable\IdentifiableInterface;
  7. use Doctrine\ORM\AbstractQuery;
  8. use Doctrine\ORM\Query;
  9. use Doctrine\ORM\QueryBuilder;
  10. use Doctrine\ORM\EntityRepository as DoctrineEntityRepository;
  11. /**
  12.  * Class EntityRepository
  13.  * @package Cms\CoreBundle\Util\Doctrine
  14.  *
  15.  * @method EntityManager getEntityManager()
  16.  */
  17. abstract class EntityRepository extends DoctrineEntityRepository
  18. {
  19.     /**
  20.      * @param array $ids
  21.      * @return array|object[]
  22.      * @throws \Exception
  23.      */
  24.     public function findExacts(array $ids)
  25.     {
  26.         $qb $this->createQueryBuilder('things')
  27.             ->andWhere('things.id IN (:ids)')
  28.             ->setParameter('ids'$ids);
  29.         /** @var array|IdentifiableInterface[] $results */
  30.         $results $this->queryMany($qb);
  31.         if (count($results) !== count($ids)) {
  32.             throw new \Exception();
  33.         }
  34.         $fixed = [];
  35.         foreach ($results as $result) {
  36.             $fixed[$result->getId()] = $result;
  37.         }
  38.         return $results;
  39.     }
  40.     /**
  41.      * @param mixed $id
  42.      * @return object
  43.      * @throws \Exception
  44.      */
  45.     public function findExact($id)
  46.     {
  47.         if ($id === null) {
  48.             throw new \Exception(sprintf(
  49.                 'No ID was given tying to find one of type "%s".',
  50.                 $this->_class->name
  51.             ));
  52.         }
  53.         $entity $this->find($id);
  54.         if ($entity === null) {
  55.             throw new \Exception(sprintf(
  56.                 'Entity with ID #%s of type "%s" was not found.',
  57.                 $id,
  58.                 $this->_class->name
  59.             ));
  60.         }
  61.         return $entity;
  62.     }
  63.     /**
  64.      * @param mixed $query
  65.      * @param int $limit
  66.      * @param int $page
  67.      * @return array
  68.      */
  69.     public function queryMany($query$limit 0$page 0)
  70.     {
  71.         // enforce proper query type
  72.         $query Querying::query($query);
  73.         // handle paging
  74.         $this->applyPaging($query$limit$page);
  75.         // get results
  76.         return $query->getResult();
  77.     }
  78.     /**
  79.      * @param Query $query
  80.      * @param int $limit
  81.      * @param int $page
  82.      * @return Query
  83.      */
  84.     private function applyPaging(Query $query$limit 0$page 0)
  85.     {
  86.         // determine if we need to do paging
  87.         if ($limit 0) {
  88.             // calculate paging
  89.             $first = ($page $limit);
  90.             $max $limit;
  91.             // apply paging
  92.             $query->setFirstResult($first);
  93.             $query->setMaxResults($max);
  94.         }
  95.         // chain
  96.         return $query;
  97.     }
  98.     /**
  99.      * @param mixed $query
  100.      * @return mixed
  101.      */
  102.     public function queryOne($query)
  103.     {
  104.         // enforce proper query type
  105.         $query Querying::query($query);
  106.         // force settings
  107.         $query->setFirstResult(0);
  108.         $query->setMaxResults(1);
  109.         // run it
  110.         return $query->getOneOrNullResult();
  111.     }
  112.     /**
  113.      * @param mixed $query
  114.      * @return array|mixed[]
  115.      * @throws \Exception
  116.      */
  117.     public function querySingleScalar($query)
  118.     {
  119.         return $this->queryHydrator($querySingleColumnHydrator::HYDRATOR);
  120.     }
  121.     /**
  122.      * @param mixed $query
  123.      * @param int $limit
  124.      * @param int $page
  125.      * @return array|mixed[]
  126.      * @throws \Exception
  127.      */
  128.     public function queryManySingleScalar($query$limit 0$page 0)
  129.     {
  130.         return $this->queryManyHydrator($querySingleColumnHydrator::HYDRATOR$limit$page);
  131.     }
  132.     /**
  133.      * @param mixed $query
  134.      * @param int $hydrator
  135.      * @param int $limit
  136.      * @param int $page
  137.      * @return array|mixed[]
  138.      * @throws \Exception
  139.      */
  140.     public function queryManyHydrator($query$hydrator$limit 0$page 0)
  141.     {
  142.         // check for no hydrator
  143.         if (empty($hydrator)) {
  144.             $hydrator AbstractQuery::HYDRATE_OBJECT;
  145.         }
  146.         // enforce proper query type
  147.         $query Querying::query($query);
  148.         // do paging
  149.         $this->applyPaging($query$limit$page);
  150.         // run it
  151.         return $query->getResult($hydrator);
  152.     }
  153.     /**
  154.      * @param mixed $query
  155.      * @param int $hydrator
  156.      * @return array|mixed[]
  157.      * @throws \Exception
  158.      */
  159.     public function queryHydrator($query$hydrator)
  160.     {
  161.         // check for no hydrator
  162.         if (empty($hydrator)) {
  163.             $hydrator AbstractQuery::HYDRATE_OBJECT;
  164.         }
  165.         // enforce proper query type
  166.         $query Querying::query($query);
  167.         // run it
  168.         return $query->getResult($hydrator);
  169.     }
  170.     /**
  171.      * @param mixed $query
  172.      * @return int
  173.      */
  174.     protected function doUpdate($query)
  175.     {
  176.         return Querying::query($query)->execute();
  177.     }
  178.     /**
  179.      * @param mixed $query
  180.      * @return int
  181.      */
  182.     protected function doDelete($query)
  183.     {
  184.         return Querying::query($query)->execute();
  185.     }
  186.     /**
  187.      * Checks if criteria contains unique values.
  188.      *
  189.      * @param int $id Skip record with this id
  190.      * @param array $criteria
  191.      * @return bool
  192.      */
  193.     public function isUnique($id$criteria)
  194.     {
  195.         $builder $this->createQueryBuilder('entities');
  196.         if ($id) {
  197.             $builder
  198.                 ->andWhere('entities.id != :id')
  199.                 ->setParameter('id'$id)
  200.             ;
  201.         }
  202.         foreach ((array)$criteria as $field => $value) {
  203.             if ($value) {
  204.                 $builder
  205.                     ->andWhere('entities.'.$field.' = :'.$field)
  206.                     ->setParameter($field$value)
  207.                 ;
  208.             }
  209.         }
  210.         return is_null($this->queryOne($builder));
  211.     }
  212.     /**
  213.      * @param int|null $limit
  214.      * @param int $page
  215.      * @param Container|null $container
  216.      * @return array
  217.      */
  218.     public function findPaginationAll(?int $limit nullint $page 0, ?Container $container null): array
  219.     {
  220.         $offset $page $limit $page null;
  221.         $params = [];
  222.         if ($container !== null) {
  223.             $params['container'] = $container;
  224.         }
  225.         return $this->findBy($paramsnull$limit$offset);
  226.     }
  227. }