Completed
Push — master ( 78b760...4e9afa )
by Gorka
19:01
created

QueryBuilderTrait   A

Complexity

Total Complexity 26

Size/Duplication

Total Lines 197
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 26
c 1
b 0
f 0
lcom 1
cbo 2
dl 0
loc 197
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A getPropertyName() 0 4 2
A getAlias() 0 4 1
B addCriteria() 0 16 5
A orderBy() 0 12 3
A addEqCriteria() 0 8 1
A addNeqCriteria() 0 8 1
A addLikeCriteria() 0 12 3
A addIsNullCriteria() 0 8 2
A addInCriteria() 0 8 2
B addBetweenCriteria() 0 22 6
1
<?php
2
3
/*
4
 * This file is part of the Kreta package.
5
 *
6
 * (c) Beñat Espiña <[email protected]>
7
 * (c) Gorka Laucirica <[email protected]>
8
 *
9
 * For the full copyright and license information, please view the LICENSE
10
 * file that was distributed with this source code.
11
 */
12
13
namespace Kreta\Component\Core\Repository\Traits;
14
15
use Doctrine\ORM\QueryBuilder;
16
17
/**
18
 * Trait QueryBuilderTrait.
19
 *
20
 * @package Kreta\Component\Core\Repository\Traits
21
 */
22
trait QueryBuilderTrait
23
{
24
    /**
25
     * Manages the criteria by statement into queries.
26
     *
27
     * @param \Doctrine\ORM\QueryBuilder $queryBuilder The query builder
28
     * @param string[]                   $criteria     Array which contains the criteria as key value
29
     *
30
     * @return \Doctrine\ORM\QueryBuilder
31
     */
32
    public function addCriteria(QueryBuilder $queryBuilder, array $criteria = [])
33
    {
34
        foreach ($criteria as $key => $properties) {
35
            if (!(is_array($properties))) {
36
                $properties = [$key => $properties];
37
                $key = 'eq';
38
            }
39
            foreach ($properties as $property => $value) {
40
                if (method_exists($this, $method = 'add' . ucfirst($key) . 'Criteria')) {
41
                    $this->$method($queryBuilder, $property, $value);
42
                }
43
            }
44
        }
45
46
        return $queryBuilder;
47
    }
48
49
    /**
50
     * Manages the order by statement into queries.
51
     *
52
     * @param \Doctrine\ORM\QueryBuilder $queryBuilder The query builder
53
     * @param string[]                   $sorting      Array which contains the sorting as key value,
54
     *                                                 if order is empty, the default value is DESC
55
     *
56
     * @return \Doctrine\ORM\QueryBuilder
57
     */
58
    public function orderBy(QueryBuilder $queryBuilder, array $sorting = [])
59
    {
60
        foreach ($sorting as $property => $order) {
61
            if (!(array_keys($sorting) !== range(0, count($sorting) - 1))) {
62
                $property = $order;
63
                $order = 'DESC';
64
            }
65
            $queryBuilder->addOrderBy($this->getPropertyName($property), $order);
66
        }
67
68
        return $queryBuilder;
69
    }
70
71
    /**
72
     * Composes the EQUAL query builder expression.
73
     *
74
     * @param \Doctrine\ORM\QueryBuilder $queryBuilder The query builder
75
     * @param string                     $property     The property
76
     * @param string                     $value        The value
77
     *
78
     * @return \Doctrine\ORM\QueryBuilder
79
     */
80
    protected function addEqCriteria(QueryBuilder $queryBuilder, $property, $value)
81
    {
82
        $rand = mt_rand();
83
84
        return $queryBuilder
85
            ->andWhere($queryBuilder->expr()->eq($this->getPropertyName($property), ':eqValue' . $rand))
86
            ->setParameter('eqValue' . $rand, $value);
87
    }
88
89
    /**
90
     * Composes the NOT EQUAL query builder expression.
91
     *
92
     * @param \Doctrine\ORM\QueryBuilder $queryBuilder The query builder
93
     * @param string                     $property     The property
94
     * @param string                     $value        The value
95
     *
96
     * @return \Doctrine\ORM\QueryBuilder
97
     */
98
    protected function addNeqCriteria(QueryBuilder $queryBuilder, $property, $value)
99
    {
100
        $rand = mt_rand();
101
102
        return $queryBuilder
103
            ->andWhere($queryBuilder->expr()->neq($this->getPropertyName($property), ':neqValue' . $rand))
104
            ->setParameter('neqValue' . $rand, $value);
105
    }
106
107
    /**
108
     * Composes the LIKE query builder expression.
109
     *
110
     * @param \Doctrine\ORM\QueryBuilder $queryBuilder The query builder
111
     * @param string                     $property     The property
112
     * @param string                     $value        The value
113
     *
114
     * @return \Doctrine\ORM\QueryBuilder
115
     */
116
    protected function addLikeCriteria(QueryBuilder $queryBuilder, $property, $value)
117
    {
118
        $rand = mt_rand();
119
120
        if (null !== $value && '' !== $value) {
121
            $queryBuilder
122
                ->andWhere($queryBuilder->expr()->like($this->getPropertyName($property), ':likeValue' . $rand))
123
                ->setParameter('likeValue' . $rand, '%' . $value . '%');
124
        }
125
126
        return $queryBuilder;
127
    }
128
129
    /**
130
     * Composes the IS NULL query builder expression.
131
     *
132
     * @param \Doctrine\ORM\QueryBuilder $queryBuilder The query builder
133
     * @param string                     $property     The property
134
     * @param string                     $value        The value
135
     *
136
     * @return \Doctrine\ORM\QueryBuilder
137
     */
138
    protected function addIsNullCriteria(QueryBuilder $queryBuilder, $property, $value)
139
    {
140
        if (null === $value) {
141
            $queryBuilder->andWhere($queryBuilder->expr()->isNull($this->getPropertyName($property)));
142
        }
143
144
        return $queryBuilder;
145
    }
146
147
    /**
148
     * Composes the IN query builder expression.
149
     *
150
     * @param \Doctrine\ORM\QueryBuilder $queryBuilder The query builder
151
     * @param string                     $property     The property
152
     * @param string                     $value        The value
153
     *
154
     * @return \Doctrine\ORM\QueryBuilder
155
     */
156
    protected function addInCriteria(QueryBuilder $queryBuilder, $property, $value)
157
    {
158
        if (is_array($value)) {
159
            $queryBuilder->andWhere($queryBuilder->expr()->in($this->getPropertyName($property), $value));
160
        }
161
162
        return $queryBuilder;
163
    }
164
165
    /**
166
     * Composes the BETWEEN query builder expression.
167
     *
168
     * @param \Doctrine\ORM\QueryBuilder $queryBuilder The query builder
169
     * @param string                     $property     The property
170
     * @param \DateTime|array            $value        The value can be datetime or array which contains two datetimes
171
     *
172
     * @return \Doctrine\ORM\QueryBuilder
173
     */
174
    protected function addBetweenCriteria(QueryBuilder $queryBuilder, $property, $value)
175
    {
176
        if ($value instanceof \DateTime) {
177
            $now = new \DateTime();
178
179
            return $queryBuilder
180
                ->andWhere($queryBuilder->expr()->between($this->getPropertyName($property), ':from', ':to'))
181
                ->setParameter('from', $value->format('Y-m-d'))
182
                ->setParameter('to', $now->format('Y-m-d'));
183
        }
184
185
        if (is_array($value)
186
            && count($value) === 2
187
            && $value[0] instanceof \DateTime
188
            && $value[1] instanceof \DateTime
189
        ) {
190
            return $queryBuilder
191
                ->andWhere($queryBuilder->expr()->between($this->getPropertyName($property), ':from', ':to'))
192
                ->setParameter('from', $value[0]->format('Y-m-d'))
193
                ->setParameter('to', $value[1]->format('Y-m-d'));
194
        }
195
    }
196
197
    /**
198
     * Gets property name.
199
     *
200
     * @param string $name The property name
201
     *
202
     * @return string
203
     */
204
    protected function getPropertyName($name)
205
    {
206
        return !strpos($name, '.') ? $this->getAlias() . '.' . $name : $name;
207
    }
208
209
    /**
210
     * Gets the entity name alias.
211
     *
212
     * @return string
213
     */
214
    protected function getAlias()
215
    {
216
        return 'kreta';
217
    }
218
}
219