Completed
Push — master ( 610b25...043997 )
by WEBEWEB
01:52
created

dataTablesCountTotal()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 12
rs 9.4285
cc 1
eloc 5
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\Wrapper\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 {
26
27
    /**
28
     * {@inheritdoc}
29
     */
30
    public function dataTablesCountFiltered(DataTablesWrapper $dtWrapper) {
31
32
        // Get the prefix.
33
        $prefix = $dtWrapper->getMapping()->getPrefix();
34
35
        // Create a query builder.
36
        $qb = $this->createQueryBuilder($prefix)
37
            ->select("COUNT(" . $prefix . ")");
38
39
        // Build the where clause.
40
        self::dataTablesWhere($qb, $dtWrapper);
41
42
        // Return the single scalar result.
43
        return $qb->getQuery()->getSingleScalarResult();
44
    }
45
46
    /**
47
     * {@inheritdoc}
48
     */
49
    public function dataTablesCountTotal(DataTablesWrapper $dtWrapper) {
50
51
        // Get the prefix.
52
        $prefix = $dtWrapper->getMapping()->getPrefix();
53
54
        // Create a query builder.
55
        $qb = $this->createQueryBuilder($prefix)
56
            ->select("COUNT(" . $prefix . ")");
57
58
        // Return the single scalar result.
59
        return $qb->getQuery()->getSingleScalarResult();
60
    }
61
62
    /**
63
     * {@inheritdoc}
64
     */
65
    public function dataTablesFind(DataTablesWrapper $dtWrapper) {
66
67
        // Get the prefix.
68
        $prefix = $dtWrapper->getMapping()->getPrefix();
69
70
        // Create a query builder.
71
        $qb = $this->createQueryBuilder($prefix)
72
            ->select("COUNT(" . $prefix . ")");
73
74
        // Build the where and order clauses.
75
        self::dataTablesWhere($qb, $dtWrapper);
76
        self::dataTablesOrder($qb, $dtWrapper);
77
78
        // Return the result.
79
        return $qb->getQuery()->getResult();
80
    }
81
82
    /**
83
     * Build the operator.
84
     *
85
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
86
     * @return string Returns the operator.
87
     */
88
    protected static function dataTablesOperator(DataTablesWrapper $dtWrapper) {
89
90
        // Initialize the operator.
91
        $operator = null;
92
93
        // Check if the DataTables columns defines a search.
94
        foreach ($dtWrapper->getRequest()->getColumns() as $column) {
95
            $dtColumn = $dtWrapper->getColumn($column["name"]);
96
            if (null !== $dtColumn && true === $dtColumn->getSearchable() && "" !== $column["search"]["value"]) {
97
                $operator = "AND";
98
                break;
99
            }
100
        }
101
102
        // Check if the DataTables defines a search.
103
        if (null === $operator && "" !== $dtWrapper->getRequest()->getSearch()) {
104
            $operator = "OR";
105
        }
106
107
        // Return the operator.
108
        return $operator;
109
    }
110
111
    /**
112
     * Build an ORDER clause.
113
     *
114
     * @param QueryBuilder $queryBuilder The query builder.
115
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
116
     * @return void
117
     */
118
    public static function dataTablesOrder(QueryBuilder $queryBuilder, DataTablesWrapper $dtWrapper) {
119
120
        // Handle each column.
121
        foreach ($dtWrapper->getRequest()->getOrder() as $order) {
122
123
            // Get the column names.
124
            $columnNames = array_keys($dtWrapper->getColumns());
125
126
            // Get and check the column index.
127
            $columnIndex = intval($order["column"]);
128
            if ($columnIndex < 0 && count($dtWrapper->getColumns()) < $columnIndex) {
129
                continue;
130
            }
131
132
            // Get the DataTables column.
133
            $dtColumn = $dtWrapper->getColumns()[$columnNames[$columnIndex]];
134
135
            // Check if the column is orderable.
136
            if (false === $dtColumn->getOrderable()) {
137
                continue;
138
            }
139
140
            //
141
            $sort   = [];
142
            $sort[] = $dtColumn->getMapping()->getPrefix();
143
            $sort[] = $dtColumn->getMapping()->getColumn();
144
145
            // Add the order by.
146
            $queryBuilder->addOrderBy(implode(".", $sort), $order["dir"]);
147
        }
148
    }
149
150
    /**
151
     * Build a WHERE clause.
152
     *
153
     * @param QueryBuilder $queryBuilder The query builder.
154
     * @param DataTablesWrapper $dtWrapper The DataTables wrapper.
155
     * @return void
156
     */
157
    public static function dataTablesWhere(QueryBuilder $queryBuilder, DataTablesWrapper $dtWrapper) {
158
159
        // Get and check the operator.
160
        $operator = self::dataTablesOperator($dtWrapper);
161
        if (null === $operator) {
162
            return;
163
        }
164
165
        // Initialize.
166
        $wheres = [];
167
        $params = [];
168
        $values = [];
169
170
        // Handle each column.
171
        foreach ($dtWrapper->getRequest()->getColumns() as $column) {
172
173
            // Get the DataTables column.
174
            $dtColumn = $dtWrapper->getColumn($column["name"]);
175
176
            // Check the DataTables column.
177
            if (null !== $dtColumn && true === $dtColumn->getSearchable() && ("OR" === $operator || "" !== $column["search"]["value"])) {
178
179
                //
180
                $mPrefix = $dtColumn->getMapping()->getPrefix();
181
                $mColumn = $dtColumn->getMapping()->getColumn();
182
183
                // Add.
184
                $wheres[] = $mPrefix . "." . $mColumn . " LIKE :" . $mPrefix . $mColumn;
185
                $params[] = ":" . $mPrefix . $mColumn;
186
                $values[] = "%" . ("AND" === $operator ? $column["search"]["value"] : $dtWrapper->getRequest()->getSearch()["value"]) . "%";
187
            }
188
        }
189
190
        // Set the where.
191
        $queryBuilder->andWhere("(" . implode(" " . $operator . " ", $wheres) . ")");
192
        for ($i = count($params) - 1; 0 <= $i; --$i) {
193
            $queryBuilder->setParameter($params[$i], $values[$i]);
194
        }
195
    }
196
197
}
198