@@ -11,6 +11,8 @@ final class AlternativeLoader implements StepBuilderInterface
11
11
{
12
12
/** @var array<array-key, array{value: Node\Expr, type: string}> */
13
13
private array $ parameters = [];
14
+ /** @var array<array-key, array{value: Node\Expr, type: string}> */
15
+ private array $ parametersLists = [];
14
16
15
17
public function __construct (private readonly Node \Expr $ query )
16
18
{
@@ -101,6 +103,76 @@ public function addBinaryParam(int|string $key, Node\Expr $param): self
101
103
return $ this ;
102
104
}
103
105
106
+ public function addStringParamList (int |string $ key , Node \Expr $ param ): StepBuilderInterface
107
+ {
108
+ $ this ->parametersLists [$ key ] = [
109
+ 'value ' => $ param ,
110
+ 'type ' => 'string ' ,
111
+ ];
112
+
113
+ return $ this ;
114
+ }
115
+
116
+ public function addIntegerParamList (int |string $ key , Node \Expr $ param ): StepBuilderInterface
117
+ {
118
+ $ this ->parametersLists [$ key ] = [
119
+ 'value ' => $ param ,
120
+ 'type ' => 'integer ' ,
121
+ ];
122
+
123
+ return $ this ;
124
+ }
125
+
126
+ public function addBooleanParamList (int |string $ key , Node \Expr $ param ): StepBuilderInterface
127
+ {
128
+ $ this ->parametersLists [$ key ] = [
129
+ 'value ' => $ param ,
130
+ 'type ' => 'boolean ' ,
131
+ ];
132
+
133
+ return $ this ;
134
+ }
135
+
136
+ public function addDateParamList (int |string $ key , Node \Expr $ param ): self
137
+ {
138
+ $ this ->parametersLists [$ key ] = [
139
+ 'value ' => $ param ,
140
+ 'type ' => 'date ' ,
141
+ ];
142
+
143
+ return $ this ;
144
+ }
145
+
146
+ public function addDateTimeParamList (int |string $ key , Node \Expr $ param ): self
147
+ {
148
+ $ this ->parametersLists [$ key ] = [
149
+ 'value ' => $ param ,
150
+ 'type ' => 'datetime ' ,
151
+ ];
152
+
153
+ return $ this ;
154
+ }
155
+
156
+ public function addJSONParamList (int |string $ key , Node \Expr $ param ): self
157
+ {
158
+ $ this ->parametersLists [$ key ] = [
159
+ 'value ' => $ param ,
160
+ 'type ' => 'json ' ,
161
+ ];
162
+
163
+ return $ this ;
164
+ }
165
+
166
+ public function addBinaryParamList (int |string $ key , Node \Expr $ param ): self
167
+ {
168
+ $ this ->parametersLists [$ key ] = [
169
+ 'value ' => $ param ,
170
+ 'type ' => 'binary ' ,
171
+ ];
172
+
173
+ return $ this ;
174
+ }
175
+
104
176
public function getNode (): Node
105
177
{
106
178
return new Node \Stmt \Expression (
@@ -126,7 +198,7 @@ public function getNode(): Node
126
198
)
127
199
)
128
200
),
129
- ...$ this ->compileParameters (),
201
+ ...$ this ->getParameters (),
130
202
new Node \Stmt \Expression (
131
203
expr: new Node \Expr \MethodCall (
132
204
var: new Node \Expr \Variable ('statement ' ),
@@ -147,115 +219,135 @@ public function getNode(): Node
147
219
);
148
220
}
149
221
150
- public function compileParameters (): iterable
222
+ public function getParameters (): iterable
151
223
{
152
224
foreach ($ this ->parameters as $ key => $ parameter ) {
153
- yield match ($ parameter ['type ' ]) {
154
- 'datetime ' => new Node \Stmt \Expression (
155
- new Node \Expr \MethodCall (
156
- var: new Node \Expr \Variable ('statement ' ),
157
- name: new Node \Identifier ('bindValue ' ),
158
- args: [
225
+ yield $ this ->compileParameter ($ key , $ parameter );
226
+ }
227
+
228
+ foreach ($ this ->parametersLists as $ key => $ parameter ) {
229
+ yield new Node \Stmt \Foreach_ (
230
+ expr: $ parameter ['value ' ],
231
+ valueVar: new Node \Expr \Variable ('value ' ),
232
+ subNodes: [
233
+ 'keyVar ' => new Node \Expr \Variable ('key ' ),
234
+ 'stmts ' => [
235
+ $ this ->compileParameter (
159
236
new Node \Arg (
160
- \is_string ($ key ) ? new Node \Scalar \Encapsed (
161
- [
162
- new Node \Scalar \EncapsedStringPart (': ' ),
163
- new Node \Scalar \EncapsedStringPart ($ key ),
164
- ]
165
- ) : new Node \Scalar \LNumber ($ key )
237
+ new Node \Expr \BinaryOp \Concat (
238
+ new Node \Scalar \String_ ($ key .'_ ' ),
239
+ new Node \Expr \Variable ('key ' ),
240
+ )
166
241
),
167
- new Node \Arg (
168
- value: new Node \Expr \MethodCall (
169
- var: $ parameter ['value ' ],
170
- name: new Node \Name ('format ' ),
171
- args: [
172
- new Node \Arg (
173
- value: new Node \Scalar \String_ ('YYYY-MM-DD HH:MI:SS ' )
174
- ),
175
- ],
176
- ),
242
+ [
243
+ 'type ' => $ parameter ['type ' ],
244
+ 'value ' => new Node \Expr \Variable ('value ' ),
245
+ ]
246
+ ),
247
+ ],
248
+ ]
249
+ );
250
+ }
251
+ }
252
+
253
+ public function compileParameter (int |string |Node \Arg $ key , array $ parameter ): Node \Stmt \Expression
254
+ {
255
+ return match ($ parameter ['type ' ]) {
256
+ 'datetime ' => new Node \Stmt \Expression (
257
+ new Node \Expr \MethodCall (
258
+ var: new Node \Expr \Variable ('statement ' ),
259
+ name: new Node \Identifier ('bindValue ' ),
260
+ args: [
261
+ $ this ->compileParameterKey ($ key ),
262
+ new Node \Arg (
263
+ value: new Node \Expr \MethodCall (
264
+ var: $ parameter ['value ' ],
265
+ name: new Node \Name ('format ' ),
266
+ args: [
267
+ new Node \Arg (
268
+ value: new Node \Scalar \String_ ('YYYY-MM-DD HH:MI:SS ' )
269
+ ),
270
+ ],
177
271
),
178
- $ this -> compileParameterType ( $ parameter ),
179
- ] ,
180
- ) ,
272
+ ),
273
+ $ this -> compileParameterType ( $ parameter ) ,
274
+ ] ,
181
275
),
182
- 'date ' => new Node \Stmt \Expression (
183
- new Node \Expr \MethodCall (
184
- var: new Node \Expr \Variable ('statement ' ),
185
- name: new Node \Identifier ('bindValue ' ),
186
- args: [
187
- new Node \Arg (
188
- \is_string ($ key ) ? new Node \Scalar \Encapsed (
189
- [
190
- new Node \Scalar \EncapsedStringPart (': ' ),
191
- new Node \Scalar \EncapsedStringPart ($ key ),
192
- ]
193
- ) : new Node \Scalar \LNumber ($ key )
194
- ),
195
- new Node \Arg (
196
- value: new Node \Expr \MethodCall (
197
- var: $ parameter ['value ' ],
198
- name: new Node \Name ('format ' ),
199
- args: [
200
- new Node \Arg (
201
- value: new Node \Scalar \String_ ('YYYY-MM-DD ' )
202
- ),
203
- ],
204
- ),
276
+ ),
277
+ 'date ' => new Node \Stmt \Expression (
278
+ new Node \Expr \MethodCall (
279
+ var: new Node \Expr \Variable ('statement ' ),
280
+ name: new Node \Identifier ('bindValue ' ),
281
+ args: [
282
+ $ this ->compileParameterKey ($ key ),
283
+ new Node \Arg (
284
+ value: new Node \Expr \MethodCall (
285
+ var: $ parameter ['value ' ],
286
+ name: new Node \Name ('format ' ),
287
+ args: [
288
+ new Node \Arg (
289
+ value: new Node \Scalar \String_ ('YYYY-MM-DD ' )
290
+ ),
291
+ ],
205
292
),
206
- $ this -> compileParameterType ( $ parameter ),
207
- ] ,
208
- ) ,
293
+ ),
294
+ $ this -> compileParameterType ( $ parameter ) ,
295
+ ] ,
209
296
),
210
- 'json ' => new Node \Stmt \Expression (
211
- new Node \Expr \MethodCall (
212
- var: new Node \Expr \Variable ('statement ' ),
213
- name: new Node \Identifier ('bindValue ' ),
214
- args: [
215
- new Node \Arg (
216
- \is_string ($ key ) ? new Node \Scalar \Encapsed (
217
- [
218
- new Node \Scalar \EncapsedStringPart (': ' ),
219
- new Node \Scalar \EncapsedStringPart ($ key ),
220
- ]
221
- ) : new Node \Scalar \LNumber ($ key )
222
- ),
223
- new Node \Arg (
224
- new Node \Expr \FuncCall (
225
- name: new Node \Name ('json_encode ' ),
226
- args: [
227
- new Node \Arg (
228
- value: $ parameter ['value ' ]
229
- ),
230
- ],
231
- ),
297
+ ),
298
+ 'json ' => new Node \Stmt \Expression (
299
+ new Node \Expr \MethodCall (
300
+ var: new Node \Expr \Variable ('statement ' ),
301
+ name: new Node \Identifier ('bindValue ' ),
302
+ args: [
303
+ $ this ->compileParameterKey ($ key ),
304
+ new Node \Arg (
305
+ new Node \Expr \FuncCall (
306
+ name: new Node \Name ('json_encode ' ),
307
+ args: [
308
+ new Node \Arg (
309
+ value: $ parameter ['value ' ]
310
+ ),
311
+ ],
232
312
),
233
- $ this -> compileParameterType ( $ parameter ),
234
- ] ,
235
- ) ,
313
+ ),
314
+ $ this -> compileParameterType ( $ parameter ) ,
315
+ ] ,
236
316
),
237
- default => new Node \Stmt \Expression (
238
- new Node \Expr \MethodCall (
239
- var: new Node \Expr \Variable ('statement ' ),
240
- name: new Node \Identifier ('bindValue ' ),
241
- args: [
242
- new Node \Arg (
243
- \is_string ($ key ) ? new Node \Scalar \Encapsed (
244
- [
245
- new Node \Scalar \EncapsedStringPart (': ' ),
246
- new Node \Scalar \EncapsedStringPart ($ key ),
247
- ]
248
- ) : new Node \Scalar \LNumber ($ key )
249
- ),
250
- new Node \Arg (
251
- $ parameter ['value ' ]
252
- ),
253
- $ this ->compileParameterType ($ parameter ),
254
- ],
255
- ),
317
+ ),
318
+ default => new Node \Stmt \Expression (
319
+ new Node \Expr \MethodCall (
320
+ var: new Node \Expr \Variable ('statement ' ),
321
+ name: new Node \Identifier ('bindValue ' ),
322
+ args: [
323
+ $ this ->compileParameterKey ($ key ),
324
+ new Node \Arg (
325
+ $ parameter ['value ' ]
326
+ ),
327
+ $ this ->compileParameterType ($ parameter ),
328
+ ],
256
329
),
257
- };
330
+ ),
331
+ };
332
+ }
333
+
334
+ private function compileParameterKey (int |string |Node \Arg $ key ): Node \Arg
335
+ {
336
+ if (\is_string ($ key )) {
337
+ return new Node \Arg (
338
+ new Node \Scalar \Encapsed ([
339
+ new Node \Scalar \EncapsedStringPart (': ' ),
340
+ new Node \Scalar \EncapsedStringPart ($ key ),
341
+ ])
342
+ );
258
343
}
344
+ if ($ key instanceof Node \Arg) {
345
+ return $ key ;
346
+ }
347
+
348
+ return new Node \Arg (
349
+ new Node \Scalar \LNumber ($ key )
350
+ );
259
351
}
260
352
261
353
private function compileParameterType (array $ parameter ): Node \Arg
0 commit comments