Passed
Pull Request — master (#51)
by Arman
04:26
created

Criteria::having()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 3
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Quantum PHP Framework
5
 *
6
 * An open source software development framework for PHP
7
 *
8
 * @package Quantum
9
 * @author Arman Ag. <[email protected]>
10
 * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org)
11
 * @link http://quantum.softberg.org/
12
 * @since 2.6.0
13
 */
14
15
namespace Quantum\Libraries\Database\Idiorm\Statements;
16
17
use Quantum\Libraries\Database\DbalInterface;
18
use Quantum\Exceptions\DatabaseException;
19
20
/**
21
 * Trait Criteria
22
 * @package Quantum\Libraries\Database\Idiorm\Statements
23
 */
24
trait Criteria
25
{
26
27
    /**
28
     * @inheritDoc
29
     * @throws \Quantum\Exceptions\DatabaseException
30
     */
31
    public function criteria(string $column, string $operator, $value = null): DbalInterface
32
    {
33
        if (!key_exists($operator, $this->operators)) {
34
            throw DatabaseException::operatorNotSupported($operator);
35
        }
36
37
        $this->addCriteria($column, $operator, $value, $this->operators[$operator]);
38
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this returns the type Quantum\Libraries\Databa...orm\Statements\Criteria which is incompatible with the type-hinted return Quantum\Libraries\Database\DbalInterface.
Loading history...
39
    }
40
41
    /**
42
     * @inheritDoc
43
     * @throws \Quantum\Exceptions\DatabaseException
44
     */
45
    public function criterias(...$criterias): DbalInterface
46
    {
47
        foreach ($criterias as $criteria) {
48
49
            if (is_array($criteria[0])) {
50
                $this->orCriteria($criteria);
51
                continue;
52
            }
53
54
            $this->criteria(...$criteria);
0 ignored issues
show
Bug introduced by
The call to Quantum\Libraries\Databa...ts\Criteria::criteria() has too few arguments starting with operator. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

54
            $this->/** @scrutinizer ignore-call */ 
55
                   criteria(...$criteria);

This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
55
        }
56
57
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this returns the type Quantum\Libraries\Databa...orm\Statements\Criteria which is incompatible with the type-hinted return Quantum\Libraries\Database\DbalInterface.
Loading history...
58
    }
59
60
    /**
61
     * @inheritDoc
62
     * @throws \Quantum\Exceptions\DatabaseException
63
     */
64
    public function having(string $column, string $operator, string $value = null): DbalInterface
65
    {
66
        if (!key_exists($operator, $this->operators)) {
67
            throw DatabaseException::operatorNotSupported($operator);
68
        }
69
70
        $func = $this->operators[$operator];
71
        $this->getOrmModel()->$func($column, $value);
0 ignored issues
show
Bug introduced by
It seems like getOrmModel() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

71
        $this->/** @scrutinizer ignore-call */ 
72
               getOrmModel()->$func($column, $value);
Loading history...
72
        return $this;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this returns the type Quantum\Libraries\Databa...orm\Statements\Criteria which is incompatible with the type-hinted return Quantum\Libraries\Database\DbalInterface.
Loading history...
73
    }
74
75
    /**
76
     * Adds Criteria
77
     * @param string $column
78
     * @param string $operator
79
     * @param mixed $value
80
     * @param string|null $func
81
     * @throws \Quantum\Exceptions\DatabaseException
82
     */
83
    protected function addCriteria(string $column, string $operator, $value, string $func = null)
84
    {
85
        if ($operator == '#=#') {
86
            $this->getOrmModel()->where_raw($column . ' = ' . $value);
87
        } else if (is_array($value) && count($value) == 1 && key($value) == 'fn') {
88
            $this->getOrmModel()->where_raw($column . ' ' . $operator . ' ' . $value['fn']);
89
        } else {
90
            $this->getOrmModel()->$func($column, $value);
91
        }
92
    }
93
94
    /**
95
     * Adds one or more OR criteria in brackets
96
     * @param array $orCriterias
97
     * @throws \Quantum\Exceptions\DatabaseException
98
     */
99
    protected function orCriteria(array $orCriterias)
100
    {
101
        $clause = '';
102
        $params = [];
103
104
        foreach ($orCriterias as $index => $criteria) {
105
            if ($index == 0) {
106
                $clause .= '(';
107
            }
108
109
            $clause .= '`' . $criteria[0] . '` ' . $criteria[1] . ' ?';
110
111
            if ($index == array_key_last($orCriterias)) {
112
                $clause .= ')';
113
            } else {
114
                $clause .= ' OR ';
115
            }
116
117
            array_push($params, $criteria[2]);
118
        }
119
120
        $this->getOrmModel()->where_raw($clause, $params);
121
    }
122
123
}