src/Repository/SpecificationTrait.php line 67

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by simpson <simpsonwork@gmail.com>
  4.  * Date: 2019-03-20
  5.  * Time: 13:11
  6.  */
  7. namespace App\Repository;
  8. use Doctrine\ORM\AbstractQuery;
  9. use Doctrine\ORM\Query;
  10. use Doctrine\ORM\QueryBuilder;
  11. use Gedmo\Translatable\Query\TreeWalker\TranslationWalker;
  12. use Happyr\DoctrineSpecification\Filter\Filter;
  13. use Happyr\DoctrineSpecification\Query\QueryModifier;
  14. use Happyr\DoctrineSpecification\Repository\EntitySpecificationRepositoryTrait;
  15. use Happyr\DoctrineSpecification\Result\ResultModifier;
  16. use Porpaginas\Doctrine\ORM\ORMQueryResult;
  17. trait SpecificationTrait
  18. {
  19.     use EntitySpecificationRepositoryTrait;
  20.     public function matchingSpec(Filter|QueryModifier $specification, ?ResultModifier $modifier nullbool $fetchCollection true): ORMQueryResult
  21.     {
  22.         $qb $this->getQueryBuilder($specification);
  23.         if (method_exists($this,'modifyListingQueryBuilder')) {
  24.             $this->modifyListingQueryBuilder($qb$this->getAlias());
  25.         }
  26.         $query $qb->getQuery();
  27.         $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKERTranslationWalker::class);
  28.         if (null !== $modifier) {
  29.             $modifier->modify($query);
  30.         }
  31.         return new ORMQueryResult($query$fetchCollection);
  32.     }
  33.     public function listIdMatchingSpec(Filter|QueryModifier $specificationint $offset, ?int $limit): array
  34.     {
  35.         /** @var QueryBuilder $qb */
  36.         $qb $this->createQueryBuilder($dqlAlias 'p');
  37.         $qb->select('p.id');
  38.         $specification->modify($qb$dqlAlias);
  39.         $qb->andWhere($specification->getFilter($qb$dqlAlias));
  40.         if($offset !== -1) {
  41.             $qb->setFirstResult($offset);
  42.         }
  43.         if(null !== $limit) {
  44.             $qb->setMaxResults($limit);
  45.         }
  46.         $result $qb->getQuery()->getResult();
  47.         return array_map(function(array $row) {
  48.             return $row['id'];
  49.         }, $result);
  50.     }
  51.     public function countMatchingSpec(Filter|QueryModifier $specification): int
  52.     {
  53.         /** @var QueryBuilder $qb */
  54.         $qb $this->createQueryBuilder($dqlAlias 'p');
  55.         $qb->select('count(p.id)');
  56.         $qb->andWhere($specification->getFilter($qb$dqlAlias));
  57.         $specification->modify($qb$dqlAlias);
  58.         return (int)$qb->getQuery()->getSingleScalarResult();
  59.     }
  60.     public function matchingSpecRaw(Filter|QueryModifier $specification, ?ResultModifier $modifier nullbool $useListingModifier true, callable $hydrator null): array
  61.     {
  62.         $qb $this->getQueryBuilder($specification);
  63.         if (true == $useListingModifier && method_exists($this,'modifyListingQueryBuilder')) {
  64.             $this->modifyListingQueryBuilder($qb$this->getAlias());
  65.         }
  66.         $query $qb->getQuery();
  67.         $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKERTranslationWalker::class);
  68.         if (null !== $modifier) {
  69.             $modifier->modify($query);
  70.         }
  71.         if(null != $hydrator) {
  72.             $rows $query->getArrayResult();
  73.             $result array_map(function($row) use ($hydrator) {
  74.                 return $hydrator($row);
  75.             }, $rows);
  76.         } else {
  77.             $result $query->getResult();
  78.         }
  79.         return $result;
  80.     }
  81. }