@@ -34,71 +34,78 @@ public function withState(Node\Expr $state): StepBuilderInterface
34
34
return $ this ;
35
35
}
36
36
37
- public function addStringParam (int |string $ key , Node \Expr $ param ): StepBuilderInterface
37
+ public function addStringParam (int |string $ key , Node \Expr $ param, null | bool $ iterable = false ): StepBuilderInterface
38
38
{
39
39
$ this ->parameters [$ key ] = [
40
40
'value ' => $ param ,
41
41
'type ' => 'string ' ,
42
+ 'iterable ' => $ iterable ,
42
43
];
43
44
44
45
return $ this ;
45
46
}
46
47
47
- public function addIntegerParam (int |string $ key , Node \Expr $ param ): StepBuilderInterface
48
+ public function addIntegerParam (int |string $ key , Node \Expr $ param, null | bool $ iterable = false ): StepBuilderInterface
48
49
{
49
50
$ this ->parameters [$ key ] = [
50
51
'value ' => $ param ,
51
52
'type ' => 'integer ' ,
53
+ 'iterable ' => $ iterable ,
52
54
];
53
55
54
56
return $ this ;
55
57
}
56
58
57
- public function addBooleanParam (int |string $ key , Node \Expr $ param ): StepBuilderInterface
59
+ public function addBooleanParam (int |string $ key , Node \Expr $ param, null | bool $ iterable = false ): StepBuilderInterface
58
60
{
59
61
$ this ->parameters [$ key ] = [
60
62
'value ' => $ param ,
61
63
'type ' => 'boolean ' ,
64
+ 'iterable ' => $ iterable ,
62
65
];
63
66
64
67
return $ this ;
65
68
}
66
69
67
- public function addDateParam (int |string $ key , Node \Expr $ param ): self
70
+ public function addDateParam (int |string $ key , Node \Expr $ param, null | bool $ iterable = false ): self
68
71
{
69
72
$ this ->parameters [$ key ] = [
70
73
'value ' => $ param ,
71
74
'type ' => 'date ' ,
75
+ 'iterable ' => $ iterable ,
72
76
];
73
77
74
78
return $ this ;
75
79
}
76
80
77
- public function addDateTimeParam (int |string $ key , Node \Expr $ param ): self
81
+ public function addDateTimeParam (int |string $ key , Node \Expr $ param, null | bool $ iterable = false ): self
78
82
{
79
83
$ this ->parameters [$ key ] = [
80
84
'value ' => $ param ,
81
85
'type ' => 'datetime ' ,
86
+ 'iterable ' => $ iterable ,
82
87
];
83
88
84
89
return $ this ;
85
90
}
86
91
87
- public function addJSONParam (int |string $ key , Node \Expr $ param ): self
92
+ public function addJSONParam (int |string $ key , Node \Expr $ param, null | bool $ iterable = false ): self
88
93
{
89
94
$ this ->parameters [$ key ] = [
90
95
'value ' => $ param ,
91
96
'type ' => 'json ' ,
97
+ 'iterable ' => $ iterable ,
92
98
];
93
99
94
100
return $ this ;
95
101
}
96
102
97
- public function addBinaryParam (int |string $ key , Node \Expr $ param ): self
103
+ public function addBinaryParam (int |string $ key , Node \Expr $ param, null | bool $ iterable = false ): self
98
104
{
99
105
$ this ->parameters [$ key ] = [
100
106
'value ' => $ param ,
101
107
'type ' => 'binary ' ,
108
+ 'iterable ' => $ iterable ,
102
109
];
103
110
104
111
return $ this ;
@@ -151,7 +158,7 @@ public function getAlternativeLookupNode(): Node
151
158
),
152
159
),
153
160
),
154
- ...$ this ->compileParameters (),
161
+ ...$ this ->getParameters (),
155
162
new Node \Stmt \Expression (
156
163
expr: new Node \Expr \MethodCall (
157
164
var: new Node \Expr \Variable ('stmt ' ),
@@ -233,121 +240,141 @@ class: new Node\Name\FullyQualified('PDO'),
233
240
))->getNode ();
234
241
}
235
242
236
- public function compileParameters (): iterable
243
+ public function getParameters (): iterable
237
244
{
238
245
foreach ($ this ->parameters as $ key => $ parameter ) {
239
- yield match ($ parameter ['type ' ]) {
240
- 'datetime ' => new Node \Stmt \Expression (
241
- new Node \Expr \MethodCall (
242
- var: new Node \Expr \Variable ('stmt ' ),
243
- name: new Node \Identifier ('bindValue ' ),
244
- args: [
245
- new Node \Arg (
246
- \is_string ($ key ) ? new Node \Scalar \Encapsed (
247
- [
248
- new Node \Scalar \EncapsedStringPart (': ' ),
249
- new Node \Scalar \EncapsedStringPart ($ key ),
250
- ]
251
- ) : new Node \Scalar \LNumber ($ key )
252
- ),
253
- new Node \Arg (
254
- value: new Node \Expr \StaticCall (
255
- class: new Node \Name ('DateTimeImmutable ' ),
256
- name: new Node \Name ('createFromFormat ' ),
257
- args: [
258
- new Node \Arg (
259
- value: new Node \Scalar \String_ ('YYYY-MM-DD HH:MI:SS ' )
260
- ),
261
- new Node \Arg (
262
- value: $ parameter ['value ' ]
263
- ),
264
- ],
246
+ if (\array_key_exists ('iterable ' , $ parameter ) && true === $ parameter ['iterable ' ]) {
247
+ yield new Node \Stmt \Foreach_ (
248
+ expr: $ parameter ['value ' ],
249
+ valueVar: new Node \Expr \Variable ('value ' ),
250
+ subNodes: [
251
+ 'keyVar ' => new Node \Expr \Variable ('key ' ),
252
+ 'stmts ' => [
253
+ $ this ->compileParameters (
254
+ new Node \Arg (
255
+ new Node \Expr \BinaryOp \Concat (
256
+ new Node \Scalar \String_ ($ key .'_ ' ),
257
+ new Node \Expr \Variable ('key ' ),
258
+ )
265
259
),
260
+ [
261
+ 'type ' => $ parameter ['type ' ],
262
+ 'value ' => new Node \Expr \Variable ('value ' ),
263
+ ]
266
264
),
267
- $ this ->compileParameterType ($ parameter ),
268
265
],
269
- ),
270
- ),
271
- 'date ' => new Node \Stmt \Expression (
272
- new Node \Expr \MethodCall (
273
- var: new Node \Expr \Variable ('stmt ' ),
274
- name: new Node \Identifier ('bindValue ' ),
275
- args: [
276
- new Node \Arg (
277
- \is_string ($ key ) ? new Node \Scalar \Encapsed (
278
- [
279
- new Node \Scalar \EncapsedStringPart (': ' ),
280
- new Node \Scalar \EncapsedStringPart ($ key ),
281
- ]
282
- ) : new Node \Scalar \LNumber ($ key )
283
- ),
284
- new Node \Arg (
285
- value: new Node \Expr \StaticCall (
286
- class: new Node \Name ('DateTimeImmutable ' ),
287
- name: new Node \Name ('createFromFormat ' ),
288
- args: [
289
- new Node \Arg (
290
- value: new Node \Scalar \String_ ('YYYY-MM-DD ' )
291
- ),
292
- new Node \Arg (
293
- value: $ parameter ['value ' ]
294
- ),
295
- ],
296
- ),
266
+ ]
267
+ );
268
+ } else {
269
+ yield $ this ->compileParameters ($ key , $ parameter );
270
+ }
271
+ }
272
+ }
273
+
274
+ private function compileParameters (int |string |Node \Arg $ key , array $ parameter ): Node \Stmt \Expression
275
+ {
276
+ return match ($ parameter ['type ' ]) {
277
+ 'datetime ' => new Node \Stmt \Expression (
278
+ new Node \Expr \MethodCall (
279
+ var: new Node \Expr \Variable ('stmt ' ),
280
+ name: new Node \Identifier ('bindValue ' ),
281
+ args: [
282
+ $ this ->compileParameterKey ($ key ),
283
+ new Node \Arg (
284
+ value: new Node \Expr \StaticCall (
285
+ class: new Node \Name ('DateTimeImmutable ' ),
286
+ name: new Node \Name ('createFromFormat ' ),
287
+ args: [
288
+ new Node \Arg (
289
+ value: new Node \Scalar \String_ ('YYYY-MM-DD HH:MI:SS ' )
290
+ ),
291
+ new Node \Arg (
292
+ value: $ parameter ['value ' ]
293
+ ),
294
+ ],
297
295
),
298
- $ this -> compileParameterType ( $ parameter ),
299
- ] ,
300
- ) ,
296
+ ),
297
+ $ this -> compileParameterType ( $ parameter ) ,
298
+ ] ,
301
299
),
302
- 'json ' => new Node \Stmt \Expression (
303
- new Node \Expr \MethodCall (
304
- var: new Node \Expr \Variable ('stmt ' ),
305
- name: new Node \Identifier ('bindValue ' ),
306
- args: [
307
- new Node \Arg (
308
- \is_string ($ key ) ? new Node \Scalar \Encapsed (
309
- [
310
- new Node \Scalar \EncapsedStringPart (': ' ),
311
- new Node \Scalar \EncapsedStringPart ($ key ),
312
- ]
313
- ) : new Node \Scalar \LNumber ($ key )
314
- ),
315
- new Node \Arg (
316
- new Node \Expr \FuncCall (
317
- name: new Node \Name ('json_decode ' ),
318
- args: [
319
- new Node \Arg (
320
- value: $ parameter ['value ' ]
321
- ),
322
- ],
323
- ),
300
+ ),
301
+ 'date ' => new Node \Stmt \Expression (
302
+ new Node \Expr \MethodCall (
303
+ var: new Node \Expr \Variable ('stmt ' ),
304
+ name: new Node \Identifier ('bindValue ' ),
305
+ args: [
306
+ $ this ->compileParameterKey ($ key ),
307
+ new Node \Arg (
308
+ value: new Node \Expr \StaticCall (
309
+ class: new Node \Name ('DateTimeImmutable ' ),
310
+ name: new Node \Name ('createFromFormat ' ),
311
+ args: [
312
+ new Node \Arg (
313
+ value: new Node \Scalar \String_ ('YYYY-MM-DD ' )
314
+ ),
315
+ new Node \Arg (
316
+ value: $ parameter ['value ' ]
317
+ ),
318
+ ],
324
319
),
325
- $ this -> compileParameterType ( $ parameter ),
326
- ] ,
327
- ) ,
320
+ ),
321
+ $ this -> compileParameterType ( $ parameter ) ,
322
+ ] ,
328
323
),
329
- default => new Node \ Stmt \ Expression (
330
- new Node \Expr \ MethodCall (
331
- var: new Node \Expr \Variable ( ' stmt ' ),
332
- name : new Node \Identifier ( ' bindValue ' ),
333
- args: [
334
- new Node \ Arg (
335
- \is_string ($ key ) ? new Node \ Scalar \ Encapsed (
336
- [
337
- new Node \Scalar \ EncapsedStringPart ( ' : ' ),
338
- new Node \Scalar \ EncapsedStringPart ( $ key ),
339
- ]
340
- ) : new Node \Scalar \ LNumber ( $ key )
341
- ),
342
- new Node \ Arg (
343
- $ parameter [ ' value ' ]
324
+ ),
325
+ ' json ' => new Node \Stmt \ Expression (
326
+ new Node \Expr \MethodCall (
327
+ var : new Node \Expr \ Variable ( ' stmt ' ),
328
+ name: new Node \ Identifier ( ' bindValue ' ),
329
+ args: [
330
+ $ this -> compileParameterKey ($ key ),
331
+ new Node \ Arg (
332
+ new Node \Expr \ FuncCall (
333
+ name: new Node \Name ( ' json_decode ' ),
334
+ args: [
335
+ new Node \Arg (
336
+ value: $ parameter [ ' value ' ]
337
+ ),
338
+ ],
344
339
),
345
- $ this ->compileParameterType ($ parameter ),
346
- ],
347
- ),
340
+ ),
341
+ $ this ->compileParameterType ($ parameter ),
342
+ ],
343
+ ),
344
+ ),
345
+ default => new Node \Stmt \Expression (
346
+ new Node \Expr \MethodCall (
347
+ var: new Node \Expr \Variable ('stmt ' ),
348
+ name: new Node \Identifier ('bindValue ' ),
349
+ args: [
350
+ $ this ->compileParameterKey ($ key ),
351
+ new Node \Arg (
352
+ $ parameter ['value ' ]
353
+ ),
354
+ $ this ->compileParameterType ($ parameter ),
355
+ ],
348
356
),
349
- };
357
+ ),
358
+ };
359
+ }
360
+
361
+ private function compileParameterKey (int |string |Node \Arg $ key ): Node \Arg
362
+ {
363
+ if (\is_string ($ key )) {
364
+ return new Node \Arg (
365
+ new Node \Scalar \Encapsed ([
366
+ new Node \Scalar \EncapsedStringPart (': ' ),
367
+ new Node \Scalar \EncapsedStringPart ($ key ),
368
+ ])
369
+ );
370
+ }
371
+ if ($ key instanceof Node \Arg) {
372
+ return $ key ;
350
373
}
374
+
375
+ return new Node \Arg (
376
+ new Node \Scalar \LNumber ($ key )
377
+ );
351
378
}
352
379
353
380
private function compileParameterType (array $ parameter ): Node \Arg
0 commit comments