1 | <?php |
||||||
2 | |||||||
3 | namespace HexMakina\Crudites\Grammar\Query; |
||||||
4 | |||||||
5 | |||||||
6 | use HexMakina\Crudites\Grammar\Grammar; |
||||||
7 | use HexMakina\Crudites\Grammar\Deck; |
||||||
8 | |||||||
9 | use HexMakina\Crudites\Grammar\Clause\Clause; |
||||||
10 | use HexMakina\Crudites\Grammar\Clause\Where; |
||||||
11 | use HexMakina\Crudites\Grammar\Clause\Joins; |
||||||
12 | use HexMakina\Crudites\Grammar\Clause\Join; |
||||||
13 | use HexMakina\Crudites\Grammar\Clause\GroupBy; |
||||||
14 | use HexMakina\Crudites\Grammar\Clause\OrderBy; |
||||||
15 | use HexMakina\Crudites\Grammar\Clause\Limit; |
||||||
16 | |||||||
17 | class Select extends Query |
||||||
18 | { |
||||||
19 | // decks handle the list of columns and expressions to be selected |
||||||
20 | private ?Deck $deck = null; |
||||||
21 | |||||||
22 | public function __construct(array $selection, string $table, $table_alias = null) |
||||||
23 | { |
||||||
24 | $this->table = $table; |
||||||
25 | $this->alias = $table_alias; |
||||||
26 | $this->selectAlso($selection); |
||||||
27 | } |
||||||
28 | |||||||
29 | public function statement(): string |
||||||
30 | { |
||||||
31 | $schema = Grammar::identifier($this->table()); |
||||||
32 | if (!empty($this->alias())) { |
||||||
33 | $schema .= ' ' . Grammar::identifier($this->alias()); |
||||||
34 | } |
||||||
35 | |||||||
36 | $ret = sprintf('SELECT %s FROM %s', $this->deck, $schema); |
||||||
37 | |||||||
38 | foreach ( |
||||||
39 | [ |
||||||
40 | Clause::JOINS, |
||||||
41 | Clause::JOIN, |
||||||
42 | Clause::WHERE, |
||||||
43 | Clause::GROUP, |
||||||
44 | Clause::HAVING, |
||||||
45 | Clause::ORDER, |
||||||
46 | Clause::LIMIT |
||||||
47 | ] as $clause |
||||||
48 | ) { |
||||||
49 | if($this->clause($clause) === null) |
||||||
50 | continue; |
||||||
51 | |||||||
52 | $ret .= ' ' . $this->clause($clause); |
||||||
53 | } |
||||||
54 | |||||||
55 | return $ret; |
||||||
56 | } |
||||||
57 | |||||||
58 | public function tableLabel($forced_value = null) |
||||||
59 | { |
||||||
60 | return $forced_value ?? $this->table_alias ?? $this->table; |
||||||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||||||
61 | } |
||||||
62 | |||||||
63 | /** |
||||||
64 | * Adds additional columns to the SELECT statement. |
||||||
65 | * |
||||||
66 | * @param array $setter An array of column names to be added to the SELECT statement. |
||||||
67 | * |
||||||
68 | * $setter = [ |
||||||
69 | * 'column_alias' => 'column', |
||||||
70 | * 2 => 'column', |
||||||
71 | * 'table_column_alias' => ['table', 'column'], |
||||||
72 | * 5 => ['table', 'column'], |
||||||
73 | * 'function_alias' => ['GROUP_CONCAT(..)'], |
||||||
74 | * 6 => ['GROUP_CONCAT(..)'], |
||||||
75 | * ]; |
||||||
76 | * |
||||||
77 | * @return self Returns the current instance of the Select class. |
||||||
78 | */ |
||||||
79 | public function selectAlso(array $setter): self |
||||||
80 | { |
||||||
81 | if (empty($setter)) |
||||||
82 | throw new \InvalidArgumentException('EMPTY_SETTER_ARRAY'); |
||||||
83 | |||||||
84 | foreach ($setter as $alias => $column) { |
||||||
85 | |||||||
86 | if (is_int($alias)) { |
||||||
87 | $alias = null; |
||||||
88 | } |
||||||
89 | if(!isset($this->deck)){ |
||||||
90 | $this->deck = new Deck($column, $alias); |
||||||
91 | } else { |
||||||
92 | $this->deck->add($column, $alias); |
||||||
0 ignored issues
–
show
The method
add() does not exist on null .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. ![]() |
|||||||
93 | } |
||||||
94 | } |
||||||
95 | |||||||
96 | return $this; |
||||||
97 | } |
||||||
98 | |||||||
99 | public function where(?array $predicates = null): Where |
||||||
100 | { |
||||||
101 | $where = new Where($predicates); |
||||||
102 | $this->add($where); |
||||||
103 | return $where; |
||||||
104 | } |
||||||
105 | |||||||
106 | public function join(string $table, ?string $alias=null): Join |
||||||
107 | { |
||||||
108 | $join = new Join($table, $alias); |
||||||
109 | |||||||
110 | if($this->clause(Clause::JOINS) === null){ |
||||||
111 | $joins = new Joins([$join]); |
||||||
112 | $this->add($joins); |
||||||
113 | } |
||||||
114 | else{ |
||||||
115 | $this->clause(Clause::JOINS)->add($join); |
||||||
116 | } |
||||||
117 | |||||||
118 | return $join; |
||||||
119 | } |
||||||
120 | |||||||
121 | public function groupBy($selected): GroupBy |
||||||
122 | { |
||||||
123 | $group = new GroupBy($selected); |
||||||
124 | $this->add($group); |
||||||
125 | return $group; |
||||||
126 | } |
||||||
127 | |||||||
128 | public function orderBy($selected, string $direction): OrderBy |
||||||
129 | { |
||||||
130 | $order = new OrderBy($selected, $direction); |
||||||
131 | $this->add($order); |
||||||
132 | return $order; |
||||||
133 | } |
||||||
134 | |||||||
135 | public function limit(int $number, int $offset = 0): Limit |
||||||
136 | { |
||||||
137 | $limit = new Limit($number, $offset); |
||||||
138 | $this->add($limit); |
||||||
139 | return $limit; |
||||||
140 | } |
||||||
141 | } |
||||||
142 |