Passed
Push — develop ( e333c2...b3554d )
by nguereza
02:25
created

AlterTable::toEnum()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 2
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Platine Database
5
 *
6
 * Platine Database is the abstraction layer using PDO with support of query and schema builder
7
 *
8
 * This content is released under the MIT License (MIT)
9
 *
10
 * Copyright (c) 2020 Platine Database
11
 *
12
 * Permission is hereby granted, free of charge, to any person obtaining a copy
13
 * of this software and associated documentation files (the "Software"), to deal
14
 * in the Software without restriction, including without limitation the rights
15
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
 * copies of the Software, and to permit persons to whom the Software is
17
 * furnished to do so, subject to the following conditions:
18
 *
19
 * The above copyright notice and this permission notice shall be included in all
20
 * copies or substantial portions of the Software.
21
 *
22
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
 * SOFTWARE.
29
 */
30
31
/**
32
 *  @file AlterTable.php
33
 *
34
 *  The alter table schema class
35
 *
36
 *  @package    Platine\Database\Schema
37
 *  @author Platine Developers Team
38
 *  @copyright  Copyright (c) 2020
39
 *  @license    http://opensource.org/licenses/MIT  MIT License
40
 *  @link   http://www.iacademy.cf
41
 *  @version 1.0.0
42
 *  @filesource
43
 */
44
45
declare(strict_types=1);
46
47
namespace Platine\Database\Schema;
48
49
/**
50
 * Class AlterTable
51
 * @package Platine\Database\Schema
52
 */
53
class AlterTable
54
{
0 ignored issues
show
Coding Style introduced by
Opening brace must not be followed by a blank line
Loading history...
55
56
    /**
57
     * The name of table
58
     * @var string
59
     */
60
    protected string $table;
61
62
    /**
63
     * The list of commands
64
     * @var array<int, array<string, mixed>>
65
     */
66
    protected array $commands = [];
67
68
    /**
69
     * Class constructor
70
     * @param string $table
71
     */
72
    public function __construct(string $table)
73
    {
74
        $this->table = $table;
75
    }
76
77
    /**
78
     *
79
     * @return string
80
     */
81
    public function getTableName(): string
82
    {
83
        return $this->table;
84
    }
85
86
    /**
87
     *
88
     * @return array<int, array<string, mixed>>
89
     */
90
    public function getCommands(): array
91
    {
92
        return $this->commands;
93
    }
94
95
    /**
96
     *
97
     * @param string $name
98
     * @return self
99
     */
100
    public function dropIndex(string $name): self
101
    {
102
        return $this->addCommand('dropIndex', $name);
103
    }
104
105
    /**
106
     *
107
     * @param string $name
108
     * @return self
109
     */
110
    public function dropUnique(string $name): self
111
    {
112
        return $this->addCommand('dropUniqueKey', $name);
113
    }
114
115
    /**
116
     *
117
     * @param string $name
118
     * @return self
119
     */
120
    public function dropPrimary(string $name): self
121
    {
122
        return $this->addCommand('dropPrimaryKey', $name);
123
    }
124
125
    /**
126
     *
127
     * @param string $name
128
     * @return self
129
     */
130
    public function dropForeign(string $name): self
131
    {
132
        return $this->addCommand('dropForeignKey', $name);
133
    }
134
135
    /**
136
     *
137
     * @param string $name
138
     * @return self
139
     */
140
    public function dropColumn(string $name): self
141
    {
142
        return $this->addCommand('dropColumn', $name);
143
    }
144
145
    /**
146
     *
147
     * @param string $column
148
     * @return self
149
     */
150
    public function dropDefaultValue(string $column): self
151
    {
152
        return $this->addCommand('dropDefaultValue', $column);
153
    }
154
155
    /**
156
     *
157
     * @param string $oldName
158
     * @param string $newName
159
     * @return self
160
     */
161
    public function renameColumn(string $oldName, string $newName): self
162
    {
163
        return $this->addCommand('renameColumn', [
164
                    'from' => $oldName,
165
                    'column' => new AlterColumn($this, $newName)
166
        ]);
167
    }
168
169
    /**
170
     *
171
     * @param string|array<int, string> $columns
172
     * @param string|null $name
173
     * @return self
174
     */
175
    public function primary($columns, ?string $name = null): self
176
    {
177
        return $this->addKey('addPrimary', $columns, $name);
178
    }
179
180
    /**
181
     *
182
     * @param string|array<int, string> $columns
183
     * @param string|null $name
184
     * @return self
185
     */
186
    public function unique($columns, ?string $name = null): self
187
    {
188
        return $this->addKey('addUnique', $columns, $name);
189
    }
190
191
    /**
192
     *
193
     * @param string|array<int, string> $columns
194
     * @param string|null $name
195
     * @return self
196
     */
197
    public function index($columns, ?string $name = null): self
198
    {
199
        return $this->addKey('addIndex', $columns, $name);
200
    }
201
202
    /**
203
     *
204
     * @param string|array<int, string> $columns
205
     * @param string|null $name
206
     * @return ForeignKey
207
     */
208
    public function foreign($columns, ?string $name = null): ForeignKey
209
    {
210
        if (!is_array($columns)) {
211
            $columns = [$columns];
212
        }
213
        if ($name === null) {
214
            $name = $this->table . '_fk_' . implode('_', $columns);
215
        }
216
        $foreign = new ForeignKey($columns);
217
        $this->addCommand('addForeign', [
218
            'name' => $name,
219
            'foreign' => $foreign
220
        ]);
221
222
        return $foreign;
223
    }
224
225
    /**
226
     *
227
     * @param string $column
228
     * @param mixed $value
229
     * @return self
230
     */
231
    public function setDefaultValue(string $column, $value): self
232
    {
233
        return $this->addCommand('setDefaultValue', [
234
                    'column' => $column,
235
                    'value' => $value,
236
        ]);
237
    }
238
239
    /**
240
     *
241
     * @param string $name
242
     * @return AlterColumn
243
     */
244
    public function integer(string $name): AlterColumn
245
    {
246
        return $this->addColumn($name, 'integer');
247
    }
248
249
    /**
250
     *
251
     * @param string $name
252
     * @return AlterColumn
253
     */
254
    public function float(string $name): AlterColumn
255
    {
256
        return $this->addColumn($name, 'float');
257
    }
258
259
    /**
260
     *
261
     * @param string $name
262
     * @return AlterColumn
263
     */
264
    public function double(string $name): AlterColumn
265
    {
266
        return $this->addColumn($name, 'double');
267
    }
268
269
    /**
270
     *
271
     * @param string $name
272
     * @param int|null $length
273
     * @param int|null $precision
274
     * @return AlterColumn
275
     */
276
    public function decimal(
277
        string $name,
278
        ?int $length = null,
279
        ?int $precision = null
280
    ): AlterColumn {
281
        return $this->addColumn($name, 'decimal')
282
                    ->length($length)
283
                    ->set('precision', $precision);
284
    }
285
286
    /**
287
     *
288
     * @param string $name
289
     * @return AlterColumn
290
     */
291
    public function boolean(string $name): AlterColumn
292
    {
293
        return $this->addColumn($name, 'boolean');
294
    }
295
296
    /**
297
     *
298
     * @param string $name
299
     * @return AlterColumn
300
     */
301
    public function binary(string $name): AlterColumn
302
    {
303
        return $this->addColumn($name, 'binary');
304
    }
305
306
    /**
307
     *
308
     * @param string $name
309
     * @param int $length
310
     * @return AlterColumn
311
     */
312
    public function string(string $name, int $length = 255): AlterColumn
313
    {
314
        return $this->addColumn($name, 'string')
315
                    ->length($length);
316
    }
317
318
    /**
319
     *
320
     * @param string $name
321
     * @param int $length
322
     * @return AlterColumn
323
     */
324
    public function fixed(string $name, int $length = 255): AlterColumn
325
    {
326
        return $this->addColumn($name, 'fixed')
327
                    ->length($length);
328
    }
329
    
330
    /**
331
     *
332
     * @param string $name
333
     * @param array<mixed> $values
334
     * @return AlterColumn
335
     */
336
    public function enum(
337
        string $name,
338
        array $values
339
    ): AlterColumn {
340
        return $this->addColumn($name, 'enum')
341
                        ->set('values', $values);
342
    }
343
344
    /**
345
     *
346
     * @param string $name
347
     * @return AlterColumn
348
     */
349
    public function text(string $name): AlterColumn
350
    {
351
        return $this->addColumn($name, 'text');
352
    }
353
354
    /**
355
     *
356
     * @param string $name
357
     * @return AlterColumn
358
     */
359
    public function time(string $name): AlterColumn
360
    {
361
        return $this->addColumn($name, 'time');
362
    }
363
364
    /**
365
     *
366
     * @param string $name
367
     * @return AlterColumn
368
     */
369
    public function timestamp(string $name): AlterColumn
370
    {
371
        return $this->addColumn($name, 'timestamp');
372
    }
373
374
    /**
375
     *
376
     * @param string $name
377
     * @return AlterColumn
378
     */
379
    public function date(string $name): AlterColumn
380
    {
381
        return $this->addColumn($name, 'date');
382
    }
383
384
    /**
385
     *
386
     * @param string $name
387
     * @return AlterColumn
388
     */
389
    public function datetime(string $name): AlterColumn
390
    {
391
        return $this->addColumn($name, 'datetime');
392
    }
393
394
    /**
395
     *
396
     * @param string $name
397
     * @return AlterColumn
398
     */
399
    public function toInteger(string $name): AlterColumn
400
    {
401
        return $this->modifyColumn($name, 'integer');
402
    }
403
404
    /**
405
     *
406
     * @param string $name
407
     * @return AlterColumn
408
     */
409
    public function toFloat(string $name): AlterColumn
410
    {
411
        return $this->modifyColumn($name, 'float');
412
    }
413
414
    /**
415
     *
416
     * @param string $name
417
     * @return AlterColumn
418
     */
419
    public function toDouble(string $name): AlterColumn
420
    {
421
        return $this->modifyColumn($name, 'double');
422
    }
423
424
    /**
425
     * 
426
     * @param string $name
427
     * @param int|null $length
428
     * @param int|null $precision
429
     * @return AlterColumn
430
     */
431
    public function toDecimal(
432
        string $name,
433
        ?int $length = null,
434
        ?int $precision = null
435
    ): AlterColumn {
436
        return $this->modifyColumn($name, 'decimal')
437
                    ->length($length)
438
                    ->set('precision', $precision);
439
    }
440
    
441
    /**
442
     * 
443
     * @param string $name
444
     * @param array<mixed> $values
445
     * @return AlterColumn
446
     */
447
    public function toEnum(
448
        string $name,
449
        array $values
450
    ): AlterColumn {
451
        return $this->modifyColumn($name, 'enum')
452
                    ->set('values', $values);
453
    }
454
455
    /**
456
     *
457
     * @param string $name
458
     * @return AlterColumn
459
     */
460
    public function toBoolean(string $name): AlterColumn
461
    {
462
        return $this->modifyColumn($name, 'boolean');
463
    }
464
465
    /**
466
     *
467
     * @param string $name
468
     * @return AlterColumn
469
     */
470
    public function toBinary(string $name): AlterColumn
471
    {
472
        return $this->modifyColumn($name, 'binary');
473
    }
474
475
    /**
476
     *
477
     * @param string $name
478
     * @return AlterColumn
479
     */
480
    public function toString(string $name, int $length = 255): AlterColumn
481
    {
482
        return $this->modifyColumn($name, 'string')
483
                    ->length($length);
484
    }
485
486
    /**
487
     *
488
     * @param string $name
489
     * @return AlterColumn
490
     */
491
    public function toFixed(string $name, int $length = 255): AlterColumn
492
    {
493
        return $this->modifyColumn($name, 'fixed')
494
                    ->length($length);
495
    }
496
497
    /**
498
     *
499
     * @param string $name
500
     * @return AlterColumn
501
     */
502
    public function toText(string $name): AlterColumn
503
    {
504
        return $this->modifyColumn($name, 'text');
505
    }
506
507
    /**
508
     *
509
     * @param string $name
510
     * @return AlterColumn
511
     */
512
    public function toTime(string $name): AlterColumn
513
    {
514
        return $this->modifyColumn($name, 'time');
515
    }
516
517
    /**
518
     *
519
     * @param string $name
520
     * @return AlterColumn
521
     */
522
    public function toTimestamp(string $name): AlterColumn
523
    {
524
        return $this->modifyColumn($name, 'timestamp');
525
    }
526
527
    /**
528
     *
529
     * @param string $name
530
     * @return AlterColumn
531
     */
532
    public function toDate(string $name): AlterColumn
533
    {
534
        return $this->modifyColumn($name, 'date');
535
    }
536
537
    /**
538
     *
539
     * @param string $name
540
     * @return AlterColumn
541
     */
542
    public function toDatetime(string $name): AlterColumn
543
    {
544
        return $this->modifyColumn($name, 'datetime');
545
    }
546
547
    /**
548
     *
549
     * @param string $name
550
     * @param mixed $data
551
     * @return self
552
     */
553
    protected function addCommand(string $name, $data): self
554
    {
555
        $this->commands[] = [
556
            'type' => $name,
557
            'data' => $data
558
        ];
559
560
        return $this;
561
    }
562
563
    /**
564
     *
565
     * @param string $type
566
     * @param string|array<int, string> $columns
567
     * @param string|null $name
568
     * @return self
569
     */
570
    protected function addKey(string $type, $columns, ?string $name = null): self
571
    {
572
        static $maps = [
573
            'addPrimary' => 'pk',
574
            'addUnique' => 'uk',
575
            'addForeignKey' => 'fk',
576
            'addIndex' => 'ik',
577
        ];
578
579
        if (!is_array($columns)) {
580
            $columns = [$columns];
581
        }
582
583
        if ($name === null) {
584
            $name = $this->table . '_' . $maps[$type] . '_' . implode('_', $columns);
585
        }
586
587
        return $this->addCommand($type, [
588
                'name' => $name,
589
                'columns' => $columns
590
        ]);
591
    }
592
593
    /**
594
     *
595
     * @param string $name
596
     * @param string $type
597
     * @return AlterColumn
598
     */
599
    protected function addColumn(string $name, string $type): AlterColumn
600
    {
601
        $column = new AlterColumn($this, $name, $type);
602
        $this->addCommand('addColumn', $column);
603
604
        return $column;
605
    }
606
607
    /**
608
     *
609
     * @param string $name
610
     * @param string $type
611
     * @return AlterColumn
612
     */
613
    protected function modifyColumn(string $name, string $type): AlterColumn
614
    {
615
        $column = new AlterColumn($this, $name, $type);
616
        $column->set('handleDefault', false);
617
        $this->addCommand('modifyColumn', $column);
618
619
        return $column;
620
    }
621
}
622