MigrationTrait   F
last analyzed

Complexity

Total Complexity 107

Size/Duplication

Total Lines 544
Duplicated Lines 0 %

Test Coverage

Coverage 81.97%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 107
eloc 208
c 1
b 0
f 0
dl 0
loc 544
ccs 200
cts 244
cp 0.8197
rs 2

31 Methods

Rating   Name   Duplication   Size   Complexity  
A alterColumn() 0 8 2
C columnSchemaToBuilder() 0 48 13
A tableOptions() 0 3 1
A pivot() 0 3 1
A expandTablePrefix() 0 3 1
A addForeignKey() 0 8 2
F createTable() 0 67 18
A foreignKey() 0 3 1
A createIndex() 0 9 3
A upNewTables() 0 3 2
B _applyNewColumns() 0 30 10
A upNewColumns() 0 3 2
A dropColumn() 0 9 3
A getTableOptionsFromArray() 0 19 6
A addPrimaryKey() 0 8 2
A upNewIndex() 0 3 2
A dropForeignKeyByColumn() 0 5 3
A newIndex() 0 3 1
A _applyNewTables() 0 14 6
A formPkIndexName() 0 3 1
A formFkName() 0 3 1
A addColumn() 0 13 3
A newTables() 0 3 1
A downNewIndex() 0 3 2
A downNewColumns() 0 3 2
A formIndexName() 0 6 1
A newColumns() 0 3 1
A index() 0 3 1
A downNewTables() 0 3 2
B _applyNewIndex() 0 30 10
A dropIndexByColumn() 0 8 3

How to fix   Complexity   

Complex Class

Complex classes like MigrationTrait often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use MigrationTrait, and based on these observations, apply Extract Interface, too.

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
Are you sure the doc-type for parameter $refColumn is correct as it would always require null to be passed?
Loading history...
29
     *
30
     * @param string $type
31
     * @param null $length
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $length is correct as it would always require null to be passed?
Loading history...
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
Documentation Bug introduced by
Are you sure the doc-type for parameter $refTable is correct as it would always require null to be passed?
Loading history...
51
     * @param null $refColumn
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $refColumn is correct as it would always require null to be passed?
Loading history...
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
introduced by
The condition $name === null is always false.
Loading history...
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
Bug introduced by
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 ignore-call  annotation

97
            return $this->/** @scrutinizer ignore-call */ primaryKey();
Loading history...
98
        }
99
        switch ($column->type) {
100
            case 'string':
101
                $builder = $this->string($size);
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

101
                /** @scrutinizer ignore-call */ 
102
                $builder = $this->string($size);
Loading history...
102
                break;
103
            case 'integer':
104
                $builder = $this->integer($size);
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

104
                /** @scrutinizer ignore-call */ 
105
                $builder = $this->integer($size);
Loading history...
105
                break;
106
            case 'datetime':
107
                $builder = $this->dateTime($precision);
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

107
                /** @scrutinizer ignore-call */ 
108
                $builder = $this->dateTime($precision);
Loading history...
108
                break;
109
            case 'text':
110
                $builder = $this->text();
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

110
                /** @scrutinizer ignore-call */ 
111
                $builder = $this->text();
Loading history...
111
                break;
112
            case 'smallint':
113
                if ($size === 1) {
114
                    $default = (boolean)$default;
115
                    $builder = $this->boolean();
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

115
                    /** @scrutinizer ignore-call */ 
116
                    $builder = $this->boolean();
Loading history...
116
                } else {
117
                    $builder = $this->smallInteger($size);
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

117
                    /** @scrutinizer ignore-call */ 
118
                    $builder = $this->smallInteger($size);
Loading history...
118
                }
119
                break;
120
            case 'binary':
121
                $builder = $this->binary()->defaultValue($default);
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

121
                $builder = $this->/** @scrutinizer ignore-call */ binary()->defaultValue($default);
Loading history...
122
                break;
123
            case 'decimal':
124
                $builder = $this->decimal($precision, $scale);
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

124
                /** @scrutinizer ignore-call */ 
125
                $builder = $this->decimal($precision, $scale);
Loading history...
125
                break;
126
            case 'double':
127
                $builder = $this->double($precision)->defaultValue($default);
0 ignored issues
show
Bug introduced by
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 ignore-call  annotation

127
                $builder = $this->/** @scrutinizer ignore-call */ double($precision)->defaultValue($default);
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
Documentation Bug introduced by
Are you sure the doc-type for parameter $options is correct as it would always require null to be passed?
Loading history...
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
Documentation Bug introduced by
Are you sure the doc-type for parameter $delete is correct as it would always require null to be passed?
Loading history...
231
     * @param null $update
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $update is correct as it would always require null to be passed?
Loading history...
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
introduced by
The condition $name === null is always false.
Loading history...
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
Bug introduced by
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 ignore-call  annotation

359
                $this->/** @scrutinizer ignore-call */ 
360
                       dropForeignKey($key, $table);

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
Documentation Bug introduced by
Are you sure the doc-type for parameter $tableOptions is correct as it would always require null to be passed?
Loading history...
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
Documentation Bug introduced by
Are you sure the doc-type for parameter $tableOptions is correct as it would always require null to be passed?
Loading history...
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
Bug introduced by
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 ignore-call  annotation

494
                $this->/** @scrutinizer ignore-call */ 
495
                       dropTable($table);
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
Bug Best Practice introduced by
The expression return $this->foreignKey...lumns)->formIndexName() also could return the type string[] which is incompatible with the documented return type string.
Loading history...
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
Bug introduced by
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 ignore-call  annotation

551
                $this->/** @scrutinizer ignore-call */ 
552
                       dropIndex($index->name, $table);

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
}