Passed
Pull Request — master (#3)
by Flavien
08:05
created

PaginationAndSortingFeaturesTrait   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 90.91%

Importance

Changes 0
Metric Value
wmc 8
lcom 1
cbo 5
dl 0
loc 79
ccs 20
cts 22
cp 0.9091
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
createQueryBuilder() 0 1 ?
getClassMetadata() 0 1 ?
A findAllPaginated() 0 15 1
A addOrderBy() 0 11 4
A addSearchBy() 0 11 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 1
    public function findAllPaginated($limit, $page, array $sorting = array(), array $searching = array())
35
    {
36 1
        $fields = array_keys($this->getClassMetadata()->fieldMappings);
37 1
        $queryBuilder = $this->createQueryBuilder('r');
38
39 1
        $queryBuilder = $this->addOrderBy($queryBuilder, $fields, $sorting);
40 1
        $queryBuilder = $this->addSearchBy($queryBuilder, $fields, $searching);
41
42 1
        $pagerAdapter = new DoctrineORMAdapter($queryBuilder);
43 1
        $pager = new Pagerfanta($pagerAdapter);
44 1
        $pager->setCurrentPage($page);
45 1
        $pager->setMaxPerPage($limit);
46
47 1
        return $pager;
48
    }
49
50
    /**
51
     * @param QueryBuilder $queryBuilder
52
     * @param array        $fields
53
     * @param array        $sorting
54
     *
55
     * @return QueryBuilder
56
     */
57 1
    protected function addOrderBy(QueryBuilder $queryBuilder, array $fields, array $sorting)
58
    {
59 1
        foreach ($fields as $field) {
60 1
            if (isset($sorting[$field])) {
61
                $direction = ($sorting[$field] === 'asc') ? 'asc' : 'desc';
62 1
                $queryBuilder->addOrderBy('r.'.$field, $direction);
63
            }
64
        }
65
66 1
        return $queryBuilder;
67
    }
68
69
    /**
70
     * @param QueryBuilder $queryBuilder
71
     * @param array        $fields
72
     * @param array        $searching
73
     *
74
     * @return QueryBuilder
75
     */
76 1
    protected function addSearchBy(QueryBuilder $queryBuilder, array $fields, array $searching)
77
    {
78 1
        foreach ($fields as $field) {
79 1
            if (isset($searching[$field])) {
80
                $queryBuilder->orWhere($queryBuilder->expr()->like('r.'.$field, ':'.$field));
81 1
                $queryBuilder->setParameter($field, '%'.$searching[$field].'%');
82
            }
83
        }
84
85 1
        return $queryBuilder;
86
    }
87
}
88