Completed
Push — master ( cc2b3d...e0d8bb )
by WEBEWEB
01:34
created

DefaultDataTablesRepository::dataTablesFindAll()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
/**
4
 * This file is part of the jquery-datatables-bundle package.
5
 *
6
 * (c) 2018 WEBEWEB
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace WBW\Bundle\JQuery\DataTablesBundle\Repository;
13
14
use Doctrine\ORM\EntityRepository;
15
use Doctrine\ORM\QueryBuilder;
16
use WBW\Bundle\JQuery\DataTablesBundle\API\DataTablesWrapper;
17
18
/**
19
 * Default DataTables repository.
20
 *
21
 * @author webeweb <https://github.com/webeweb/>
22
 * @package WBW\Bundle\JQuery\DataTablesBundle\Repository
23
 * @abstract
24
 */
25
abstract class DefaultDataTablesRepository extends EntityRepository implements DataTablesRepositoryInterface {
26
27
    /**
28
     * Append a DataTables ORDER clause.
29
     *
30
     * @param QueryBuilder $queryBuilder The query builder.
31
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
32
     * @return void
33
     */
34
    public static function appendDataTablesOrder(QueryBuilder $queryBuilder, DataTablesWrapper $dtWrapper) {
35
36
        // Handle each DataTables order.
37
        foreach ($dtWrapper->getRequest()->getOrder() as $dtOrder) {
38
39
            // Get the DataTables column.
40
            $dtColumn = array_values($dtWrapper->getColumns())[$dtOrder->getColumn()];
41
42
            // Check if the DataTables column is orderable.
43
            if (false === $dtColumn->getOrderable()) {
44
                continue;
45
            }
46
47
            // Add the order by.
48
            $queryBuilder->addOrderBy($dtColumn->getMapping()->getAlias(), $dtOrder->getDir());
49
        }
50
    }
51
52
    /**
53
     * Append a DataTables WHERE clause.
54
     *
55
     * @param QueryBuilder $queryBuilder The query builder.
56
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
57
     * @return void
58
     */
59
    public static function appendDataTablesWhere(QueryBuilder $queryBuilder, DataTablesWrapper $dtWrapper) {
60
61
        // Detremines and check the operator.
62
        $operator = self::determineDataTablesOperator($dtWrapper);
63
        if (null === $operator) {
64
            return;
65
        }
66
67
        // Initialize.
68
        $wheres = [];
69
        $params = [];
70
        $values = [];
71
72
        // Handle each DataTables column.
73
        foreach ($dtWrapper->getRequest()->getColumns() as $dtColumn) {
74
75
            // Check the DataTables column.
76
            if ("OR" === $operator || "" !== $dtColumn->getSearch()->getValue()) {
77
78
                // Get the DataTables mapping.
79
                $mapping = $dtColumn->getMapping();
80
81
                // Add.
82
                $wheres[] = $mapping->getAlias() . " LIKE :" . $mapping->getPrefix() . $mapping->getColumn();
83
                $params[] = ":" . $mapping->getPrefix() . $mapping->getColumn();
84
                $values[] = "%" . ("AND" === $operator ? $dtColumn->getSearch()->getValue() : $dtWrapper->getRequest()->getSearch()->getValue()) . "%";
85
            }
86
        }
87
88
        // Set the where clause.
89
        $queryBuilder->andWhere("(" . implode(" " . $operator . " ", $wheres) . ")");
90
        for ($i = count($params) - 1; 0 <= $i; --$i) {
91
            $queryBuilder->setParameter($params[$i], $values[$i]);
92
        }
93
    }
94
95
    /**
96
     * Build a DataTables query builder "Count filtered".
97
     *
98
     * @param DataTablesWrapper $dtWrapper The wrapper.
99
     * @return QueryBuilder Returns the DataTables query builder "Count filtered".
100
     */
101
    protected function buildDataTablesCountFiltered(DataTablesWrapper $dtWrapper) {
102
103
        // Get the prefix.
104
        $prefix = $dtWrapper->getMapping()->getPrefix();
105
106
        // Create a query builder.
107
        $qb = $this->createQueryBuilder($prefix)
108
            ->select("COUNT(" . $prefix . ")");
109
110
        // Append the where clause.
111
        self::appendDataTablesWhere($qb, $dtWrapper);
112
113
        // Return the query builder.
114
        return $qb;
115
    }
116
117
    /**
118
     * Build a DataTables query builder "Count total".
119
     *
120
     * @param DataTablesWrapper $dtWrapper The wrapper.
121
     * @return QueryBuilder Returns the DataTables query builder "Count total".
122
     */
123
    protected function buildDataTablesCountTotal(DataTablesWrapper $dtWrapper) {
124
125
        // Get the prefix.
126
        $prefix = $dtWrapper->getMapping()->getPrefix();
127
128
        // Create a query builder.
129
        $qb = $this->createQueryBuilder($prefix)
130
            ->select("COUNT(" . $prefix . ")");
131
132
        // Return the query builder.
133
        return $qb;
134
    }
135
136
    /**
137
     * Build a DataTables query builder "Find all".
138
     *
139
     * @param DataTablesWrapper $dtWrapper The wrapper.
140
     * @return QueryBuilder Returns the DataTables query builder "Find all".
141
     */
142
    protected function buildDataTablesFindAll(DataTablesWrapper $dtWrapper) {
143
144
        // Get the prefix.
145
        $prefix = $dtWrapper->getMapping()->getPrefix();
146
147
        // Create a query builder.
148
        $qb = $this->createQueryBuilder($prefix)
149
            ->setFirstResult($dtWrapper->getRequest()->getStart())
150
            ->setMaxResults($dtWrapper->getRequest()->getLength());
151
152
        // Build the where and order clauses.
153
        self::appendDataTablesWhere($qb, $dtWrapper);
154
        self::appendDataTablesOrder($qb, $dtWrapper);
155
156
        // Return the query builder.
157
        return $qb;
158
    }
159
160
    /**
161
     * {@inheritdoc}
162
     */
163
    public function dataTablesCountFiltered(DataTablesWrapper $dtWrapper) {
164
165
        // Build a DataTables query builder.
166
        $qb = $this->buildDataTablesCountFiltered($dtWrapper);
167
168
        // Return the single scalar result.
169
        return intval($qb->getQuery()->getSingleScalarResult());
170
    }
171
172
    /**
173
     * {@inheritdoc}
174
     */
175
    public function dataTablesCountTotal(DataTablesWrapper $dtWrapper) {
176
177
        // Build a DataTables query builder.
178
        $qb = $this->buildDataTablesCountTotal($dtWrapper);
179
180
        // Return the single scalar result.
181
        return intval($qb->getQuery()->getSingleScalarResult());
182
    }
183
184
    /**
185
     * {@inheritdoc}
186
     */
187
    public function dataTablesFindAll(DataTablesWrapper $dtWrapper) {
188
189
        // Build a DataTables query builder.
190
        $qb = $this->buildDataTablesFindAll($dtWrapper);
191
192
        // Return the result.
193
        return $qb->getQuery()->getResult();
194
    }
195
196
    /**
197
     * Determines a DataTables operator.
198
     *
199
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
200
     * @return string Returns the DataTables operator.
201
     */
202
    protected static function determineDataTablesOperator(DataTablesWrapper $dtWrapper) {
203
204
        // Check if the DataTables columns defines a search.
205
        foreach ($dtWrapper->getRequest()->getColumns() as $dtColumn) {
206
            if ("" !== $dtColumn->getSearch()->getValue()) {
207
                return "AND";
208
            }
209
        }
210
211
        // Check if the DataTables defines a search.
212
        if ("" !== $dtWrapper->getRequest()->getSearch()->getValue()) {
213
            return "OR";
214
        }
215
216
        // Return the operator.
217
        return null;
218
    }
219
220
}
221