<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-03-20
* Time: 13:11
*/
namespace App\Repository;
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Gedmo\Translatable\Query\TreeWalker\TranslationWalker;
use Happyr\DoctrineSpecification\Filter\Filter;
use Happyr\DoctrineSpecification\Query\QueryModifier;
use Happyr\DoctrineSpecification\Repository\EntitySpecificationRepositoryTrait;
use Happyr\DoctrineSpecification\Result\ResultModifier;
use Porpaginas\Doctrine\ORM\ORMQueryResult;
trait SpecificationTrait
{
use EntitySpecificationRepositoryTrait;
public function matchingSpec(Filter|QueryModifier $specification, ?ResultModifier $modifier = null, bool $fetchCollection = true): ORMQueryResult
{
$qb = $this->getQueryBuilder($specification);
if (method_exists($this,'modifyListingQueryBuilder')) {
$this->modifyListingQueryBuilder($qb, $this->getAlias());
}
$query = $qb->getQuery();
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, TranslationWalker::class);
if (null !== $modifier) {
$modifier->modify($query);
}
return new ORMQueryResult($query, $fetchCollection);
}
public function listIdMatchingSpec(Filter|QueryModifier $specification, int $offset, ?int $limit): array
{
/** @var QueryBuilder $qb */
$qb = $this->createQueryBuilder($dqlAlias = 'p');
$qb->select('p.id');
$specification->modify($qb, $dqlAlias);
$qb->andWhere($specification->getFilter($qb, $dqlAlias));
if($offset !== -1) {
$qb->setFirstResult($offset);
}
if(null !== $limit) {
$qb->setMaxResults($limit);
}
$result = $qb->getQuery()->getResult();
return array_map(function(array $row) {
return $row['id'];
}, $result);
}
public function countMatchingSpec(Filter|QueryModifier $specification): int
{
/** @var QueryBuilder $qb */
$qb = $this->createQueryBuilder($dqlAlias = 'p');
$qb->select('count(p.id)');
$qb->andWhere($specification->getFilter($qb, $dqlAlias));
$specification->modify($qb, $dqlAlias);
return (int)$qb->getQuery()->getSingleScalarResult();
}
public function matchingSpecRaw(Filter|QueryModifier $specification, ?ResultModifier $modifier = null, bool $useListingModifier = true, callable $hydrator = null): array
{
$qb = $this->getQueryBuilder($specification);
if (true == $useListingModifier && method_exists($this,'modifyListingQueryBuilder')) {
$this->modifyListingQueryBuilder($qb, $this->getAlias());
}
$query = $qb->getQuery();
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, TranslationWalker::class);
if (null !== $modifier) {
$modifier->modify($query);
}
if(null != $hydrator) {
$rows = $query->getArrayResult();
$result = array_map(function($row) use ($hydrator) {
return $hydrator($row);
}, $rows);
} else {
$result = $query->getResult();
}
return $result;
}
}