carono /
yii2-migrate
| 1 | <?php |
||||||
| 2 | |||||||
| 3 | |||||||
| 4 | namespace carono\yii2migrate\traits; |
||||||
| 5 | |||||||
| 6 | use carono\yii2migrate\ForeignKeyColumn; |
||||||
| 7 | use carono\yii2migrate\helpers\SchemaHelper; |
||||||
| 8 | use carono\yii2migrate\IndexColumn; |
||||||
| 9 | use carono\yii2migrate\PivotColumn; |
||||||
| 10 | use yii\db\ColumnSchema; |
||||||
| 11 | use yii\db\ColumnSchemaBuilder; |
||||||
| 12 | use yii\db\Migration; |
||||||
| 13 | use yii\db\Schema; |
||||||
| 14 | use yii\helpers\ArrayHelper; |
||||||
| 15 | |||||||
| 16 | /** |
||||||
| 17 | * Trait MigrationTrait |
||||||
| 18 | * |
||||||
| 19 | * @package carono\yii2migrate\traits |
||||||
| 20 | * @mixin Migration |
||||||
| 21 | */ |
||||||
| 22 | trait MigrationTrait |
||||||
| 23 | { |
||||||
| 24 | private static $tableOptions = '@tableOptions'; |
||||||
| 25 | |||||||
| 26 | /** |
||||||
| 27 | * @param $refTable |
||||||
| 28 | * @param null $refColumn |
||||||
|
0 ignored issues
–
show
Documentation
Bug
introduced
by
Loading history...
|
|||||||
| 29 | * |
||||||
| 30 | * @param string $type |
||||||
| 31 | * @param null $length |
||||||
|
0 ignored issues
–
show
|
|||||||
| 32 | * @return ForeignKeyColumn |
||||||
| 33 | */ |
||||||
| 34 | 44 | public function foreignKey($refTable = null, $refColumn = null, $type = Schema::TYPE_INTEGER, $length = null) |
|||||
| 35 | { |
||||||
| 36 | 44 | return (new ForeignKeyColumn($type, $length))->refTable($refTable)->refColumn($refColumn)->setMigrate($this); |
|||||
| 37 | } |
||||||
| 38 | |||||||
| 39 | /** |
||||||
| 40 | * @param array $columns |
||||||
| 41 | * @param bool $isUnique |
||||||
| 42 | * @return IndexColumn |
||||||
| 43 | */ |
||||||
| 44 | 7 | public function index($columns = [], $isUnique = false) |
|||||
| 45 | { |
||||||
| 46 | 7 | return (new IndexColumn())->setMigrate($this)->columns($columns)->unique($isUnique); |
|||||
| 47 | } |
||||||
| 48 | |||||||
| 49 | /** |
||||||
| 50 | * @param null $refTable |
||||||
|
0 ignored issues
–
show
|
|||||||
| 51 | * @param null $refColumn |
||||||
|
0 ignored issues
–
show
|
|||||||
| 52 | * |
||||||
| 53 | * @return PivotColumn |
||||||
| 54 | */ |
||||||
| 55 | 10 | public function pivot($refTable = null, $refColumn = null) |
|||||
| 56 | { |
||||||
| 57 | 10 | return (new PivotColumn())->refTable($refTable)->refColumn($refColumn)->setMigrate($this); |
|||||
| 58 | } |
||||||
| 59 | |||||||
| 60 | /** |
||||||
| 61 | * @return array |
||||||
| 62 | */ |
||||||
| 63 | 52 | public function tableOptions() |
|||||
| 64 | { |
||||||
| 65 | 52 | return []; |
|||||
| 66 | } |
||||||
| 67 | |||||||
| 68 | /** |
||||||
| 69 | * @param string $name |
||||||
| 70 | * @param string $table |
||||||
| 71 | * @param array|string $columns |
||||||
| 72 | * @param bool $unique |
||||||
| 73 | */ |
||||||
| 74 | 9 | public function createIndex($name, $table, $columns, $unique = false) |
|||||
| 75 | { |
||||||
| 76 | 9 | $suffix = $unique ? '_unq' : '_idx'; |
|||||
| 77 | 9 | if ($name === null) { |
|||||
|
0 ignored issues
–
show
|
|||||||
| 78 | 2 | $name = self::formIndexName($table, $columns, $suffix, $this->db->tablePrefix); |
|||||
| 79 | 2 | $name = $this->expandTablePrefix($name); |
|||||
| 80 | } |
||||||
| 81 | 9 | $name = SchemaHelper::truncateIndexName($name, 64, $suffix); |
|||||
| 82 | 9 | parent::createIndex($name, $table, $columns, $unique); |
|||||
| 83 | 9 | } |
|||||
| 84 | |||||||
| 85 | /** |
||||||
| 86 | * @param ColumnSchema $column |
||||||
| 87 | * @return $this|ColumnSchemaBuilder |
||||||
| 88 | * @throws \Exception |
||||||
| 89 | */ |
||||||
| 90 | public function columnSchemaToBuilder(ColumnSchema $column) |
||||||
| 91 | { |
||||||
| 92 | $size = $column->size; |
||||||
| 93 | $precision = $column->precision; |
||||||
| 94 | $default = $column->defaultValue; |
||||||
| 95 | $scale = $column->scale; |
||||||
| 96 | if ($column->isPrimaryKey && $column->autoIncrement) { |
||||||
| 97 | return $this->primaryKey(); |
||||||
|
0 ignored issues
–
show
It seems like
primaryKey() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 98 | } |
||||||
| 99 | switch ($column->type) { |
||||||
| 100 | case 'string': |
||||||
| 101 | $builder = $this->string($size); |
||||||
|
0 ignored issues
–
show
It seems like
string() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 102 | break; |
||||||
| 103 | case 'integer': |
||||||
| 104 | $builder = $this->integer($size); |
||||||
|
0 ignored issues
–
show
It seems like
integer() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 105 | break; |
||||||
| 106 | case 'datetime': |
||||||
| 107 | $builder = $this->dateTime($precision); |
||||||
|
0 ignored issues
–
show
It seems like
dateTime() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 108 | break; |
||||||
| 109 | case 'text': |
||||||
| 110 | $builder = $this->text(); |
||||||
|
0 ignored issues
–
show
It seems like
text() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 111 | break; |
||||||
| 112 | case 'smallint': |
||||||
| 113 | if ($size === 1) { |
||||||
| 114 | $default = (boolean)$default; |
||||||
| 115 | $builder = $this->boolean(); |
||||||
|
0 ignored issues
–
show
It seems like
boolean() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 116 | } else { |
||||||
| 117 | $builder = $this->smallInteger($size); |
||||||
|
0 ignored issues
–
show
It seems like
smallInteger() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 118 | } |
||||||
| 119 | break; |
||||||
| 120 | case 'binary': |
||||||
| 121 | $builder = $this->binary()->defaultValue($default); |
||||||
|
0 ignored issues
–
show
It seems like
binary() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 122 | break; |
||||||
| 123 | case 'decimal': |
||||||
| 124 | $builder = $this->decimal($precision, $scale); |
||||||
|
0 ignored issues
–
show
It seems like
decimal() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 125 | break; |
||||||
| 126 | case 'double': |
||||||
| 127 | $builder = $this->double($precision)->defaultValue($default); |
||||||
|
0 ignored issues
–
show
It seems like
double() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 128 | break; |
||||||
| 129 | default: |
||||||
| 130 | throw new \Exception("Column ($column->name) type '$column->type' not recognized"); |
||||||
| 131 | } |
||||||
| 132 | $builder->defaultValue($default); |
||||||
| 133 | if (!$column->allowNull) { |
||||||
| 134 | $builder->notNull(); |
||||||
| 135 | } |
||||||
| 136 | $builder->comment($column->comment); |
||||||
| 137 | return $builder; |
||||||
| 138 | } |
||||||
| 139 | |||||||
| 140 | /** |
||||||
| 141 | * @param $name |
||||||
| 142 | * @return mixed |
||||||
| 143 | */ |
||||||
| 144 | 52 | public function expandTablePrefix($name) |
|||||
| 145 | { |
||||||
| 146 | 52 | return SchemaHelper::expandTablePrefix($name, $this->db->tablePrefix); |
|||||
| 147 | } |
||||||
| 148 | |||||||
| 149 | /** |
||||||
| 150 | * @param string $table |
||||||
| 151 | * @param array $columns |
||||||
| 152 | * @param null $options |
||||||
|
0 ignored issues
–
show
|
|||||||
| 153 | * @throws \Exception |
||||||
| 154 | */ |
||||||
| 155 | 50 | public function createTable($table, $columns, $options = null) |
|||||
| 156 | { |
||||||
| 157 | /** |
||||||
| 158 | * @var PivotColumn[] $pvs |
||||||
| 159 | * @var ForeignKeyColumn[] $fks |
||||||
| 160 | */ |
||||||
| 161 | 50 | echo " > create table $table ..."; |
|||||
| 162 | 50 | $time = microtime(true); |
|||||
| 163 | 50 | $pvs = []; |
|||||
| 164 | 50 | $fks = []; |
|||||
| 165 | 50 | $pks = []; |
|||||
| 166 | |||||||
| 167 | 50 | $options = $this->getTableOptionsFromArray(ArrayHelper::remove($columns, self::$tableOptions, []), $options); |
|||||
| 168 | |||||||
| 169 | 50 | foreach ($columns as $column => &$type) { |
|||||
| 170 | |||||||
| 171 | 50 | if ($type instanceof ColumnSchema) { |
|||||
| 172 | $column = is_numeric($column) ? $type->name : $column; |
||||||
| 173 | $type = $this->columnSchemaToBuilder($type); |
||||||
| 174 | } |
||||||
| 175 | 50 | if ((string)$type === (string)$this->primaryKey()) { |
|||||
| 176 | 50 | $pks[] = $column; |
|||||
| 177 | } |
||||||
| 178 | 50 | if ($type instanceof ForeignKeyColumn) { |
|||||
| 179 | 27 | $type->sourceTable($table)->sourceColumn($column); |
|||||
| 180 | 27 | $fks[] = $type; |
|||||
| 181 | } |
||||||
| 182 | |||||||
| 183 | 50 | if ($type instanceof PivotColumn) { |
|||||
| 184 | 1 | $type->setSuffix($column)->sourceTable($table); |
|||||
| 185 | 1 | $pvs[] = $type; |
|||||
| 186 | 50 | unset($columns[$column]); |
|||||
| 187 | } |
||||||
| 188 | } |
||||||
| 189 | 50 | if (count($pks) > 1) { |
|||||
| 190 | 27 | foreach ($columns as $column => &$type) { |
|||||
| 191 | 27 | $type = $this->integer(); |
|||||
| 192 | } |
||||||
| 193 | } |
||||||
| 194 | 50 | $this->db->createCommand()->createTable($table, $columns, $options)->execute(); |
|||||
| 195 | 50 | foreach ($columns as $column => $type) { |
|||||
| 196 | 50 | if ($type instanceof ColumnSchemaBuilder && $type->comment !== null) { |
|||||
| 197 | 50 | $this->db->createCommand()->addCommentOnColumn($table, $column, $type->comment)->execute(); |
|||||
| 198 | } |
||||||
| 199 | } |
||||||
| 200 | 50 | if ($fks) { |
|||||
| 201 | 27 | echo "\n"; |
|||||
| 202 | } |
||||||
| 203 | 50 | foreach ($fks as $fk) { |
|||||
| 204 | 27 | echo ' '; |
|||||
| 205 | 27 | $fk->apply(); |
|||||
| 206 | } |
||||||
| 207 | 50 | if ($fks) { |
|||||
| 208 | 27 | echo "\n"; |
|||||
| 209 | } |
||||||
| 210 | 50 | if (count($pks) > 1) { |
|||||
| 211 | 27 | echo ' '; |
|||||
| 212 | 27 | $this->addPrimaryKey(null, $table, $pks); |
|||||
| 213 | } |
||||||
| 214 | 50 | if ($pvs) { |
|||||
| 215 | 1 | echo "\n"; |
|||||
| 216 | } |
||||||
| 217 | 50 | foreach ($pvs as $pv) { |
|||||
| 218 | 1 | echo ' '; |
|||||
| 219 | 1 | $pv->apply(); |
|||||
| 220 | } |
||||||
| 221 | 50 | echo ' done (time: ' . sprintf('%.3f', microtime(true) - $time) . "s)\n"; |
|||||
| 222 | 50 | } |
|||||
| 223 | |||||||
| 224 | /** |
||||||
| 225 | * @param string $name |
||||||
| 226 | * @param string $table |
||||||
| 227 | * @param array|string $columns |
||||||
| 228 | * @param string $refTable |
||||||
| 229 | * @param array|string $refColumns |
||||||
| 230 | * @param null $delete |
||||||
|
0 ignored issues
–
show
|
|||||||
| 231 | * @param null $update |
||||||
|
0 ignored issues
–
show
|
|||||||
| 232 | */ |
||||||
| 233 | 42 | public function addForeignKey($name, $table, $columns, $refTable, $refColumns, $delete = null, $update = null) |
|||||
| 234 | { |
||||||
| 235 | 42 | if ($name === null) { |
|||||
|
0 ignored issues
–
show
|
|||||||
| 236 | 42 | $name = $this->formFkName($table, $columns, $refTable, $refColumns); |
|||||
| 237 | 42 | $name = $this->expandTablePrefix($name); |
|||||
| 238 | } |
||||||
| 239 | 42 | $name = SchemaHelper::truncateIndexName($name, 64, '_fk'); |
|||||
| 240 | 42 | parent::addForeignKey($name, $table, $columns, $refTable, $refColumns, $delete, $update); |
|||||
| 241 | 42 | } |
|||||
| 242 | |||||||
| 243 | /** |
||||||
| 244 | * @inheritdoc |
||||||
| 245 | */ |
||||||
| 246 | 2 | public function alterColumn($table, $column, $type) |
|||||
| 247 | { |
||||||
| 248 | 2 | if ($type instanceof ForeignKeyColumn) { |
|||||
| 249 | 1 | $type->sourceTable($table); |
|||||
| 250 | 1 | $type->sourceColumn($column); |
|||||
| 251 | 1 | $type->apply(); |
|||||
| 252 | } else { |
||||||
| 253 | 1 | parent::alterColumn($table, $column, $type); |
|||||
| 254 | } |
||||||
| 255 | 2 | } |
|||||
| 256 | |||||||
| 257 | /** |
||||||
| 258 | * @inheritdoc |
||||||
| 259 | */ |
||||||
| 260 | 10 | public function addColumn($table, $column, $type) |
|||||
| 261 | { |
||||||
| 262 | 10 | if ($type instanceof ForeignKeyColumn) { |
|||||
| 263 | 2 | parent::addColumn($table, $column, $type); |
|||||
| 264 | 2 | $type->sourceTable($table); |
|||||
| 265 | 2 | $type->sourceColumn($column); |
|||||
| 266 | 2 | $type->apply(); |
|||||
| 267 | 8 | } elseif ($type instanceof PivotColumn) { |
|||||
| 268 | 1 | $type->sourceTable($table); |
|||||
| 269 | 1 | $type->setSuffix($column); |
|||||
| 270 | 1 | $type->apply(); |
|||||
| 271 | } else { |
||||||
| 272 | 7 | parent::addColumn($table, $column, $type); |
|||||
| 273 | } |
||||||
| 274 | 10 | } |
|||||
| 275 | |||||||
| 276 | /** |
||||||
| 277 | * @inheritdoc |
||||||
| 278 | */ |
||||||
| 279 | 32 | public function addPrimaryKey($name, $table, $columns) |
|||||
| 280 | { |
||||||
| 281 | 32 | if ($name === null) { |
|||||
| 282 | 32 | $name = self::formIndexName($table, $columns, '_pk', $this->db->tablePrefix); |
|||||
| 283 | 32 | $name = $this->expandTablePrefix($name); |
|||||
| 284 | } |
||||||
| 285 | 32 | $name = SchemaHelper::truncateIndexName($name, 64, '_pk'); |
|||||
| 286 | 32 | parent::addPrimaryKey($name, $table, $columns); |
|||||
| 287 | 32 | } |
|||||
| 288 | |||||||
| 289 | /** |
||||||
| 290 | * @return array |
||||||
| 291 | */ |
||||||
| 292 | 1 | public function newColumns() |
|||||
| 293 | { |
||||||
| 294 | 1 | return []; |
|||||
| 295 | } |
||||||
| 296 | |||||||
| 297 | /** |
||||||
| 298 | * @param array $array |
||||||
| 299 | */ |
||||||
| 300 | 9 | public function downNewColumns($array = []) |
|||||
| 301 | { |
||||||
| 302 | 9 | $this->_applyNewColumns($array ?: $this->newColumns(), true); |
|||||
| 303 | 9 | } |
|||||
| 304 | |||||||
| 305 | /** |
||||||
| 306 | * @param array $array |
||||||
| 307 | */ |
||||||
| 308 | 9 | public function upNewColumns($array = []) |
|||||
| 309 | { |
||||||
| 310 | 9 | $this->_applyNewColumns($array ?: $this->newColumns(), false); |
|||||
| 311 | 9 | } |
|||||
| 312 | |||||||
| 313 | /** |
||||||
| 314 | * @param array $columns |
||||||
| 315 | * @param bool $revert |
||||||
| 316 | */ |
||||||
| 317 | 9 | protected function _applyNewColumns($columns = [], $revert = false) |
|||||
| 318 | { |
||||||
| 319 | 9 | $columns = $revert ? array_reverse($columns) : $columns; |
|||||
| 320 | |||||||
| 321 | 9 | $result = []; |
|||||
| 322 | 9 | foreach ($columns as $key => $column) { |
|||||
| 323 | 9 | if (is_numeric($key)) { |
|||||
| 324 | $result[] = $column; |
||||||
| 325 | } else { |
||||||
| 326 | 9 | foreach ($column as $columnName => $value) { |
|||||
| 327 | 9 | $result[] = [$key, $columnName, $value]; |
|||||
| 328 | } |
||||||
| 329 | } |
||||||
| 330 | } |
||||||
| 331 | 9 | foreach ($result as $column) { |
|||||
| 332 | 9 | if ($column[2] instanceof PivotColumn) { |
|||||
| 333 | 2 | $column[2]->setSuffix($column[1])->sourceTable($column[0]); |
|||||
| 334 | } |
||||||
| 335 | 9 | if ($revert) { |
|||||
| 336 | 9 | if ($column[2] instanceof PivotColumn) { |
|||||
| 337 | 2 | $column[2]->remove(); |
|||||
| 338 | 2 | continue; |
|||||
| 339 | } |
||||||
| 340 | 7 | $this->dropColumn($column[0], $column[1]); |
|||||
| 341 | } else { |
||||||
| 342 | 9 | if ($column[2] instanceof PivotColumn) { |
|||||
| 343 | 2 | $column[2]->apply(); |
|||||
| 344 | 2 | continue; |
|||||
| 345 | } |
||||||
| 346 | 7 | $this->addColumn($column[0], $column[1], $column[2]); |
|||||
| 347 | } |
||||||
| 348 | } |
||||||
| 349 | 9 | } |
|||||
| 350 | |||||||
| 351 | /** |
||||||
| 352 | * @inheritdoc |
||||||
| 353 | */ |
||||||
| 354 | 9 | public function dropColumn($table, $column) |
|||||
| 355 | { |
||||||
| 356 | 9 | $foreignKeys = SchemaHelper::findTableForeignKeys($this->db, $table); |
|||||
| 357 | 9 | foreach ($foreignKeys as $key => $foreignKey) { |
|||||
| 358 | 8 | if ($foreignKey->columnNames === [$column]) { |
|||||
| 359 | 8 | $this->dropForeignKey($key, $table); |
|||||
|
0 ignored issues
–
show
The method
dropForeignKey() does not exist on carono\yii2migrate\traits\MigrationTrait. Did you maybe mean dropForeignKeyByColumn()?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||||||
| 360 | } |
||||||
| 361 | } |
||||||
| 362 | 9 | return parent::dropColumn($table, $column); |
|||||
| 363 | } |
||||||
| 364 | |||||||
| 365 | /** |
||||||
| 366 | * @return array |
||||||
| 367 | */ |
||||||
| 368 | 1 | public function newTables() |
|||||
| 369 | { |
||||||
| 370 | 1 | return []; |
|||||
| 371 | } |
||||||
| 372 | |||||||
| 373 | /** |
||||||
| 374 | * @param array $array |
||||||
| 375 | * @param null $tableOptions |
||||||
|
0 ignored issues
–
show
|
|||||||
| 376 | */ |
||||||
| 377 | 5 | public function upNewTables($array = [], $tableOptions = null) |
|||||
| 378 | { |
||||||
| 379 | 5 | $this->_applyNewTables($array ?: $this->newTables(), false, $tableOptions); |
|||||
| 380 | 5 | } |
|||||
| 381 | |||||||
| 382 | /** |
||||||
| 383 | * @param array $array |
||||||
| 384 | */ |
||||||
| 385 | 2 | public function upNewIndex($array = []) |
|||||
| 386 | { |
||||||
| 387 | 2 | $this->_applyNewIndex($array ?: $this->newIndex()); |
|||||
| 388 | 2 | } |
|||||
| 389 | |||||||
| 390 | /** |
||||||
| 391 | * @param array $array |
||||||
| 392 | */ |
||||||
| 393 | 2 | public function downNewIndex($array = []) |
|||||
| 394 | { |
||||||
| 395 | 2 | $this->_applyNewIndex($array ?: $this->newIndex(), true); |
|||||
| 396 | 2 | } |
|||||
| 397 | |||||||
| 398 | /** |
||||||
| 399 | * @return array |
||||||
| 400 | */ |
||||||
| 401 | 1 | public function newIndex() |
|||||
| 402 | { |
||||||
| 403 | 1 | return []; |
|||||
| 404 | } |
||||||
| 405 | |||||||
| 406 | /** |
||||||
| 407 | * @param array $array |
||||||
| 408 | */ |
||||||
| 409 | 5 | public function downNewTables($array = []) |
|||||
| 410 | { |
||||||
| 411 | 5 | $this->_applyNewTables($array ?: $this->newTables(), true); |
|||||
| 412 | 5 | } |
|||||
| 413 | |||||||
| 414 | /** |
||||||
| 415 | * @param $indexes |
||||||
| 416 | * @param bool $revert |
||||||
| 417 | */ |
||||||
| 418 | 2 | protected function _applyNewIndex($indexes, $revert = false) |
|||||
| 419 | { |
||||||
| 420 | /** |
||||||
| 421 | * @var IndexColumn $index |
||||||
| 422 | */ |
||||||
| 423 | 2 | $indexes = $revert ? array_reverse($indexes) : $indexes; |
|||||
| 424 | 2 | foreach ($indexes as $key => $data) { |
|||||
| 425 | 2 | if (!is_numeric($key)) { |
|||||
| 426 | 1 | foreach ($data as $index) { |
|||||
| 427 | 1 | if ($index instanceof IndexColumn) { |
|||||
| 428 | 1 | $index->table($key); |
|||||
| 429 | 1 | if ($revert) { |
|||||
| 430 | 1 | $index->remove(); |
|||||
| 431 | } else { |
||||||
| 432 | 1 | $index->apply(); |
|||||
| 433 | } |
||||||
| 434 | } |
||||||
| 435 | } |
||||||
| 436 | 1 | continue; |
|||||
| 437 | } |
||||||
| 438 | |||||||
| 439 | // Old style |
||||||
| 440 | 1 | $unq = isset($data[2]) && $data[2]; |
|||||
| 441 | 1 | $columns = is_array($data[1]) ? $data[1] : explode(',', $data[1]); |
|||||
| 442 | 1 | $index = $this->index($columns, $unq)->table($data[0]); |
|||||
| 443 | |||||||
| 444 | 1 | if ($revert) { |
|||||
| 445 | 1 | $index->remove(); |
|||||
| 446 | } else { |
||||||
| 447 | 1 | $index->apply(); |
|||||
| 448 | } |
||||||
| 449 | } |
||||||
| 450 | 2 | } |
|||||
| 451 | |||||||
| 452 | /** |
||||||
| 453 | * @param array|string $items |
||||||
| 454 | * @param string|array $default |
||||||
| 455 | * @return array|mixed|string |
||||||
| 456 | */ |
||||||
| 457 | 54 | private function getTableOptionsFromArray($items, $default = '') |
|||||
| 458 | { |
||||||
| 459 | 54 | if (is_array($default)) { |
|||||
| 460 | 2 | $default = ArrayHelper::getValue($default, $this->db->driverName, ''); |
|||||
| 461 | } |
||||||
| 462 | |||||||
| 463 | 54 | if (!$default) { |
|||||
| 464 | 51 | $default = ArrayHelper::getValue($this->tableOptions(), $this->db->driverName, ''); |
|||||
| 465 | } |
||||||
| 466 | |||||||
| 467 | 54 | if (is_array($items)) { |
|||||
| 468 | 52 | return ArrayHelper::getValue($items, $this->db->driverName, $default); |
|||||
| 469 | } |
||||||
| 470 | |||||||
| 471 | 4 | if ($items && is_string($items)) { |
|||||
| 472 | 3 | return $items; |
|||||
| 473 | } |
||||||
| 474 | |||||||
| 475 | 1 | return $default; |
|||||
| 476 | } |
||||||
| 477 | |||||||
| 478 | /** |
||||||
| 479 | * @param $tables |
||||||
| 480 | * @param bool $revert |
||||||
| 481 | * @param null $tableOptions |
||||||
|
0 ignored issues
–
show
|
|||||||
| 482 | */ |
||||||
| 483 | 5 | protected function _applyNewTables($tables, $revert = false, $tableOptions = null) |
|||||
| 484 | { |
||||||
| 485 | 5 | $tables = $revert ? array_reverse($tables) : $tables; |
|||||
| 486 | 5 | foreach ($tables as $table => $columns) { |
|||||
| 487 | 5 | if ($revert) { |
|||||
| 488 | 5 | foreach ($columns as $column => $type) { |
|||||
| 489 | 5 | if ($type instanceof PivotColumn) { |
|||||
| 490 | 1 | $type->setSuffix($column)->sourceTable($table); |
|||||
| 491 | 5 | $type->remove(); |
|||||
| 492 | } |
||||||
| 493 | } |
||||||
| 494 | 5 | $this->dropTable($table); |
|||||
|
0 ignored issues
–
show
It seems like
dropTable() must be provided by classes using this trait. How about adding it as abstract method to this trait?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 495 | } else { |
||||||
| 496 | 5 | $this->createTable($table, $columns, $tableOptions); |
|||||
| 497 | } |
||||||
| 498 | } |
||||||
| 499 | 5 | } |
|||||
| 500 | |||||||
| 501 | /** |
||||||
| 502 | * @param $table |
||||||
| 503 | * @param $columns |
||||||
| 504 | * @param $refTable |
||||||
| 505 | * @param $refColumns |
||||||
| 506 | * @return string |
||||||
| 507 | */ |
||||||
| 508 | 43 | public function formFkName($table, $columns, $refTable, $refColumns) |
|||||
| 509 | { |
||||||
| 510 | 43 | return $this->foreignKey($refTable, $refColumns)->sourceTable($table)->sourceColumn($columns)->formIndexName(); |
|||||
|
0 ignored issues
–
show
|
|||||||
| 511 | } |
||||||
| 512 | |||||||
| 513 | /** |
||||||
| 514 | * @param $table |
||||||
| 515 | * @param $columns |
||||||
| 516 | * @param string $suffix |
||||||
| 517 | * @param string $tablePrefix |
||||||
| 518 | * @return string |
||||||
| 519 | */ |
||||||
| 520 | 1 | public static function formPkIndexName($table, $columns, $suffix = '_pk', $tablePrefix = '') |
|||||
| 521 | { |
||||||
| 522 | 1 | return self::formIndexName($table, $columns, $suffix, $tablePrefix); |
|||||
| 523 | } |
||||||
| 524 | |||||||
| 525 | /** |
||||||
| 526 | * @param $table |
||||||
| 527 | * @param $columns |
||||||
| 528 | * @param string $suffix |
||||||
| 529 | * @param string $tablePrefix |
||||||
| 530 | * @return string |
||||||
| 531 | */ |
||||||
| 532 | 39 | public static function formIndexName($table, $columns, $suffix = '_idx', $tablePrefix = '') |
|||||
| 533 | { |
||||||
| 534 | 39 | $table = SchemaHelper::expandTablePrefix($table, $tablePrefix); |
|||||
| 535 | 39 | $table = SchemaHelper::removeSchema($table); |
|||||
| 536 | 39 | $column = implode(':', array_map('trim', (array)$columns)); |
|||||
| 537 | 39 | return "{$table}:{$column}$suffix"; |
|||||
| 538 | } |
||||||
| 539 | |||||||
| 540 | /** |
||||||
| 541 | * @param $table |
||||||
| 542 | * @param $column |
||||||
| 543 | */ |
||||||
| 544 | 1 | public function dropIndexByColumn($table, $column) |
|||||
| 545 | { |
||||||
| 546 | /** |
||||||
| 547 | * @var \yii\db\IndexConstraint $index |
||||||
| 548 | */ |
||||||
| 549 | 1 | foreach (SchemaHelper::findNonUniqueIndexes($this->db, $this->expandTablePrefix($table)) as $index) { |
|||||
| 550 | 1 | if ($index->columnNames === (array)$column) { |
|||||
| 551 | 1 | $this->dropIndex($index->name, $table); |
|||||
|
0 ignored issues
–
show
The method
dropIndex() does not exist on carono\yii2migrate\traits\MigrationTrait. Did you maybe mean dropIndexByColumn()?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||||||
| 552 | } |
||||||
| 553 | } |
||||||
| 554 | 1 | } |
|||||
| 555 | |||||||
| 556 | /** |
||||||
| 557 | * @param $table |
||||||
| 558 | * @param $column |
||||||
| 559 | * @throws \yii\db\Exception |
||||||
| 560 | */ |
||||||
| 561 | 2 | public function dropForeignKeyByColumn($table, $column) |
|||||
| 562 | { |
||||||
| 563 | 2 | foreach (SchemaHelper::findTableForeignKeys($this->db, $table) as $key => $index) { |
|||||
| 564 | 2 | if ($index->columnNames === (array)$column) { |
|||||
| 565 | 2 | $this->dropForeignKey($key, $table); |
|||||
| 566 | } |
||||||
| 567 | } |
||||||
| 568 | } |
||||||
| 569 | } |