DataTablesRepositoryHelper::appendWhere()   B
last analyzed

Complexity

Conditions 8
Paths 9

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 14
c 0
b 0
f 0
dl 0
loc 24
rs 8.4444
cc 8
nc 9
nop 2
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\Helper;
13
14
use Doctrine\ORM\QueryBuilder;
15
use WBW\Bundle\JQuery\DataTablesBundle\Api\DataTablesWrapperInterface;
16
17
/**
18
 * DataTables repository helper.
19
 *
20
 * @author webeweb <https://github.com/webeweb>
21
 * @package WBW\Bundle\JQuery\DataTablesBundle\Helper
22
 */
23
class DataTablesRepositoryHelper {
24
25
    /**
26
     * Append an ORDER clause.
27
     *
28
     * @param QueryBuilder $queryBuilder The query builder.
29
     * @param DataTablesWrapperInterface $dtWrapper The wrapper.
30
     * @return void
31
     */
32
    public static function appendOrder(QueryBuilder $queryBuilder, DataTablesWrapperInterface $dtWrapper): void {
33
34
        foreach ($dtWrapper->getRequest()->getOrder() as $dtOrder) {
35
36
            $dtColumn = array_values($dtWrapper->getColumns())[$dtOrder->getColumn()];
37
            if (false === $dtColumn->getOrderable()) {
38
                continue;
39
            }
40
41
            $queryBuilder->addOrderBy(DataTablesMappingHelper::getAlias($dtColumn->getMapping()), $dtOrder->getDir());
42
        }
43
    }
44
45
    /**
46
     * Append a WHERE clause.
47
     *
48
     * @param QueryBuilder $queryBuilder The query builder.
49
     * @param DataTablesWrapperInterface $dtWrapper The wrapper.
50
     * @return void
51
     */
52
    public static function appendWhere(QueryBuilder $queryBuilder, DataTablesWrapperInterface $dtWrapper): void {
53
54
        $operator = DataTablesRepositoryHelper::determineOperator($dtWrapper);
55
        if (null === $operator) {
56
            return;
57
        }
58
59
        $wheres = [];
60
        $params = [];
61
        $values = [];
62
63
        foreach ($dtWrapper->getRequest()->getColumns() as $dtColumn) {
64
65
            if (true === $dtColumn->getSearchable() && ("OR" === $operator || "" !== $dtColumn->getSearch()->getValue())) {
66
67
                $wheres[] = DataTablesMappingHelper::getWhere($dtColumn->getMapping());
68
                $params[] = DataTablesMappingHelper::getParam($dtColumn->getMapping());
69
                $values[] = "%" . ("AND" === $operator ? $dtColumn->getSearch()->getValue() : $dtWrapper->getRequest()->getSearch()->getValue()) . "%";
70
            }
71
        }
72
73
        $queryBuilder->andWhere("(" . implode(" $operator ", $wheres) . ")");
74
        for ($i = count($params) - 1; 0 <= $i; --$i) {
75
            $queryBuilder->setParameter($params[$i], $values[$i]);
76
        }
77
    }
78
79
    /**
80
     * Determine an operator.
81
     *
82
     * @param DataTablesWrapperInterface $dtWrapper The wrapper.
83
     * @return string|null Returns the operator.
84
     */
85
    public static function determineOperator(DataTablesWrapperInterface $dtWrapper): ?string {
86
87
        foreach ($dtWrapper->getRequest()->getColumns() as $dtColumn) {
88
89
            if (false === $dtColumn->getSearchable()) {
90
                continue;
91
            }
92
93
            if ("" !== $dtColumn->getSearch()->getValue()) {
94
                return "AND";
95
            }
96
        }
97
98
        // Check if the wrapper defines a search.
99
        if ("" !== $dtWrapper->getRequest()->getSearch()->getValue()) {
100
            return "OR";
101
        }
102
103
        return null;
104
    }
105
}
106