Completed
Push — master ( dfd334...80840e )
by Restu
11:54
created

Query::__set()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 4
rs 10
1
<?php
2
namespace JayaCode\Framework\Core\Database\Query;
3
4
use JayaCode\Framework\Core\Database\Query\Grammar\Grammar;
5
6
/**
7
 * Class Query
8
 * @property array where
9
 * @property array columns
10
 * @property mixed query
11
 * @property null params
12
 * @package JayaCode\Framework\Core\Database\Query
13
 */
14
class Query
15
{
16
    /**
17
     *
18
     */
19
    const TYPE_QUERY = 'QUERY';
20
    /**
21
     *
22
     */
23
    const TYPE_SELECT = 'SELECT';
24
25
    /**
26
     * @var string
27
     */
28
    public $table;
29
30
    /**
31
     * @var array
32
     */
33
    protected $attributes = array(
34
        'where' => array(),
35
        'columns' => array()
36
    );
37
38
    /**
39
     * @var string
40
     */
41
    protected $type = "SELECT";
42
43
    /**
44
     * @param null $table
45
     */
46
    public function __construct($table = null)
47
    {
48
        $this->table = $table;
49
    }
50
51
    /**
52
     * @param $queryStr
53
     * @param $params
54
     * @return Query
55
     */
56
    public static function sql($queryStr, $params = null)
57
    {
58
        $query = new self();
59
        if ($params) {
60
            $query->params = $params;
61
        }
62
        $query->setType(self::TYPE_QUERY);
63
        $query->query = $queryStr;
64
        return $query;
65
    }
66
67
    /**
68
     * @param $table
69
     * @return Query
70
     */
71
    public static function table($table)
72
    {
73
        return new self($table);
74
    }
75
76
    /**
77
     * @param $table
78
     */
79
    public function setTable($table)
80
    {
81
        $this->table = $table;
82
    }
83
84
    /**
85
     * @param $columns
86
     * @return $this
87
     */
88
    public function select($columns = null)
89
    {
90
        $this->attributes['columns'] = $columns;
91
        $this->type = "SELECT";
92
        return $this;
93
    }
94
95
    /**
96
     * @param $query
97
     * @param string $type
98
     * @return Query
99
     */
100
    public function whereQ(Query $query, $type = "AND")
101
    {
102
        if ($query->getType() == Query::TYPE_QUERY) {
103
            $this->attributes['where'][] = array($type, $query->query);
104
        }
105
        return $this;
106
    }
107
108
    /**
109
     * @param $column
110
     * @param $value
111
     * @param string $operator
112
     * @param string $type
113
     * @return Query
114
     */
115
    public function where($column, $value, $operator = "=", $type = "AND")
116
    {
117
        $this->attributes['where'][] = array($type, array($column, $operator, $value));
118
        return $this;
119
    }
120
121
    /**
122
     * @param $column
123
     * @param $value
124
     * @param string $operator
125
     * @return Query
126
     */
127
    public function andWhere($column, $value, $operator = "=")
128
    {
129
        return $this->where($column, $value, $operator, "AND");
130
    }
131
132
    /**
133
     * @param $column
134
     * @param $value
135
     * @param string $operator
136
     * @return Query
137
     */
138
    public function orWhere($column, $value, $operator = "=")
139
    {
140
        return $this->where($column, $value, $operator, "OR");
141
    }
142
143
    /**
144
     * @param $column
145
     * @param $value
146
     * @param string $type
147
     * @return Query
148
     */
149
    public function like($column, $value, $type = "AND")
150
    {
151
        return $this->where($column, $value, "LIKE", $type);
152
    }
153
154
    /**
155
     * @param $column
156
     * @param $value
157
     * @return Query
158
     */
159
    public function andLike($column, $value)
160
    {
161
        return $this->like($column, $value);
162
    }
163
164
    /**
165
     * @param $column
166
     * @param $value
167
     * @return Query
168
     */
169
    public function orLike($column, $value)
170
    {
171
        return $this->like($column, $value, "OR");
172
    }
173
174
    /**
175
     * @param $column
176
     * @param array $value
177
     * @param string $type
178
     * @return Query
179
     */
180
    public function between($column, $value = array(), $type = "AND")
181
    {
182
        if (count($value) != 2) {
183
            throw new \OutOfBoundsException();
184
        }
185
186
        return $this->where($column, $value, "BETWEEN", $type);
187
    }
188
189
    /**
190
     * @param $column
191
     * @param array $value
192
     * @return Query
193
     */
194
    public function andBetween($column, $value = array())
195
    {
196
        return $this->between($column, $value);
197
    }
198
199
    /**
200
     * @param $column
201
     * @param $value
202
     * @return Query
203
     */
204
    public function orBetween($column, $value)
205
    {
206
        return $this->between($column, $value, "OR");
207
    }
208
209
    /**
210
     * @param Grammar $grammar
211
     * @return array
212
     */
213
    public function build(Grammar $grammar)
214
    {
215
        $grammar->setQuery($this);
216
217
        $queryStr = $grammar->build();
218
        $queryParams = isset($this->attributes['params'])?$this->attributes['params']:$grammar->getParams();
219
220
        return [$queryStr, $queryParams];
221
    }
222
223
    /**
224
     * Clear Query Builder
225
     */
226
    public function clear()
227
    {
228
        $this->attributes = array();
229
    }
230
231
    /**
232
     * @param $name
233
     * @return array
234
     */
235
    public function __get($name)
236
    {
237
        return arr_get($this->attributes, $name);
238
    }
239
240
    /**
241
     * @param $name
242
     * @param $value
243
     */
244
    public function __set($name, $value)
245
    {
246
        $this->attributes[$name] = $value;
247
    }
248
249
    /**
250
     * @return string
251
     */
252
    public function getType()
253
    {
254
        return $this->type;
255
    }
256
257
    /**
258
     * @param string $type
259
     */
260
    public function setType($type)
261
    {
262
        $this->type = $type;
263
    }
264
}
265