-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAlterTable.php
More file actions
148 lines (119 loc) · 2.95 KB
/
AlterTable.php
File metadata and controls
148 lines (119 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
namespace ModernPDO\Actions;
use ModernPDO\Fields\Field;
/**
* Class for updating tables.
*/
class AlterTable extends Action
{
/**
* @var string new table name
*/
protected string $newName = '';
/**
* @var Field[] array of new fields
*/
protected array $addFields = [];
/**
* @var array<string, string> array of rename fields
*/
protected array $renameFields = [];
/**
* @var string[] array of drop names
*/
protected array $dropFields = [];
/**
* Returns base query.
*/
protected function buildQuery(): string
{
$escaper = $this->mpdo->escaper();
$query = 'ALTER TABLE ' . $escaper->table($this->table);
// Rename table
if ($this->newName !== '') {
$query .= ' RENAME TO ' . $escaper->table($this->newName) . ', ';
}
// Add columns
if (!empty($this->addFields)) {
foreach ($this->addFields as $field) {
$query .= ' ADD COLUMN ' . $field->build($escaper) . ', ';
}
}
// Rename columns
if (!empty($this->renameFields)) {
foreach ($this->renameFields as $name => $newName) {
$query .= ' RENAME COLUMN ' . $escaper->column($name) . ' TO ' . $escaper->column($newName) . ', ';
}
}
// Drop columns
if (!empty($this->dropFields)) {
foreach ($this->dropFields as $name) {
$query .= ' DROP COLUMN ' . $escaper->column($name) . ', ';
}
}
return substr($query, 0, -2);
}
/**
* Returns placeholders.
*
* @return mixed[]
*/
protected function getPlaceholders(): array
{
return [];
}
/**
* Renames table.
*/
public function rename(string $newName): self
{
$this->newName = $newName;
return $this;
}
/**
* Adds fields to add.
*
* @param Field[] $fields array of fields
*/
public function addColumns(array $fields): self
{
$this->addFields = $fields;
return $this;
}
/**
* Adds fields to rename.
*
* @param array<string, string> $names array of names
*/
public function renameColumns(array $names): self
{
$this->renameFields = $names;
return $this;
}
/**
* Adds fields to drop.
*
* @param string[] $names array of names
*/
public function dropColumns(array $names): self
{
$this->dropFields = $names;
return $this;
}
/**
* Updates table.
*/
public function execute(): bool
{
if (
$this->newName === ''
&& empty($this->addFields)
&& empty($this->renameFields)
&& empty($this->dropFields)
) {
return false;
}
$this->query = $this->buildQuery();
return $this->exec()->status();
}
}