Passed
Pull Request — master (#1)
by Flavien
03:24
created

PaginationAndSortingFeaturesTrait::addOrderBy()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.2
c 0
b 0
f 0
nc 4
cc 4
eloc 6
nop 3
1
<?php
2
3
namespace QualityCode\ApiFeaturesBundle\Repository;
4
5
use Pagerfanta\Adapter\DoctrineORMAdapter;
6
use Pagerfanta\Pagerfanta;
7
use Doctrine\ORM\QueryBuilder;
8
9
trait PaginationAndSortingFeaturesTrait
10
{
11
    /**
12
     * Creates a new QueryBuilder instance that is prepopulated for this entity name.
13
     *
14
     * @param string $alias
15
     * @param string $indexBy The index for the from
16
     *
17
     * @return QueryBuilder
18
     */
19
    abstract public function createQueryBuilder($alias, $indexBy = null);
20
21
    /**
22
     * @return \Doctrine\ORM\Mapping\ClassMetadata
23
     */
24
    abstract protected function getClassMetadata();
25
26
    /**
27
     * @param int   $limit
28
     * @param int   $page
29
     * @param array $sorting
30
     * @param array $searching
31
     *
32
     * @return Pagerfanta
33
     */
34
    public function findAllPaginated($limit, $page, array $sorting = array(), array $searching = array())
35
    {
36
        $fields = array_keys($this->getClassMetadata()->fieldMappings);
37
        $queryBuilder = $this->createQueryBuilder('r');
38
39
        $queryBuilder = $this->addOrderBy($queryBuilder, $fields, $sorting);
40
        $queryBuilder = $this->addSearchBy($queryBuilder, $fields, $searching);
41
42
        $pagerAdapter = new DoctrineORMAdapter($queryBuilder);
43
        $pager = new Pagerfanta($pagerAdapter);
44
        $pager->setCurrentPage($page);
45
        $pager->setMaxPerPage($limit);
46
47
        return $pager;
48
    }
49
50
    /**
51
     * @param QueryBuilder $queryBuilder
52
     * @param array        $fields
53
     * @param array        $sorting
54
     *
55
     * @return QueryBuilder
56
     */
57
    protected function addOrderBy(QueryBuilder $queryBuilder, array $fields, array $sorting)
58
    {
59
        foreach ($fields as $field) {
60
            if (isset($sorting[$field])) {
61
                $direction = ($sorting[$field] === 'asc') ? 'asc' : 'desc';
62
                $queryBuilder->addOrderBy('r.'.$field, $direction);
63
            }
64
        }
65
66
        return $queryBuilder;
67
    }
68
69
    /**
70
     * @param QueryBuilder $queryBuilder
71
     * @param array        $fields
72
     * @param array        $searching
73
     *
74
     * @return QueryBuilder
75
     */
76
    protected function addSearchBy(QueryBuilder $queryBuilder, array $fields, array $searching)
77
    {
78
        foreach ($fields as $field) {
79
            if (isset($searching[$field])) {
80
                $queryBuilder->orWhere($queryBuilder->expr()->like('r.'.$field, ':'.$field));
81
                $queryBuilder->setParameter($field, '%'.$searching[$field].'%');
82
            }
83
        }
84
85
        return $queryBuilder;
86
    }
87
}
88