@@ -11,6 +11,8 @@ final class AlternativeLoader implements StepBuilderInterface
1111{
1212 /** @var array<array-key, array{value: Node\Expr, type: string}> */
1313 private array $ parameters = [];
14+ /** @var array<array-key, array{value: Node\Expr, type: string}> */
15+ private array $ parametersLists = [];
1416
1517 public function __construct (private readonly Node \Expr $ query )
1618 {
@@ -101,6 +103,76 @@ public function addBinaryParam(int|string $key, Node\Expr $param): self
101103 return $ this ;
102104 }
103105
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+
104176 public function getNode (): Node
105177 {
106178 return new Node \Stmt \Expression (
@@ -126,7 +198,7 @@ public function getNode(): Node
126198 )
127199 )
128200 ),
129- ...$ this ->compileParameters (),
201+ ...$ this ->walkParameters (),
130202 new Node \Stmt \Expression (
131203 expr: new Node \Expr \MethodCall (
132204 var: new Node \Expr \Variable ('statement ' ),
@@ -147,115 +219,135 @@ public function getNode(): Node
147219 );
148220 }
149221
150- public function compileParameters (): iterable
222+ public function walkParameters (): iterable
151223 {
152224 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 (
159236 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+ )
166241 ),
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+ ],
177271 ),
178- $ this -> compileParameterType ( $ parameter ),
179- ] ,
180- ) ,
272+ ),
273+ $ this -> compileParameterType ( $ parameter ) ,
274+ ] ,
181275 ),
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+ ],
205292 ),
206- $ this -> compileParameterType ( $ parameter ),
207- ] ,
208- ) ,
293+ ),
294+ $ this -> compileParameterType ( $ parameter ) ,
295+ ] ,
209296 ),
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+ ],
232312 ),
233- $ this -> compileParameterType ( $ parameter ),
234- ] ,
235- ) ,
313+ ),
314+ $ this -> compileParameterType ( $ parameter ) ,
315+ ] ,
236316 ),
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+ ],
256329 ),
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+ );
258343 }
344+ if ($ key instanceof Node \Arg) {
345+ return $ key ;
346+ }
347+
348+ return new Node \Arg (
349+ new Node \Scalar \LNumber ($ key )
350+ );
259351 }
260352
261353 private function compileParameterType (array $ parameter ): Node \Arg
0 commit comments