Skip to content

Commit 31d6705

Browse files
committed
[2386] SqlServerAdapter::getColumns returns non-associative array
1 parent 9e1cd7d commit 31d6705

3 files changed

Lines changed: 51 additions & 12 deletions

File tree

src/Phinx/Db/Adapter/AdapterInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ public function truncateTable(string $tableName): void;
428428
* Returns table columns
429429
*
430430
* @param string $tableName Table name
431-
* @return \Phinx\Db\Table\Column[]
431+
* @return list<\Phinx\Db\Table\Column>
432432
*/
433433
public function getColumns(string $tableName): array;
434434

src/Phinx/Db/Adapter/SqlServerAdapter.php

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ public function getColumns(string $tableName): array
487487
$column->setPrecision((int)$columnInfo['precision']);
488488
}
489489

490-
$columns[$columnInfo['name']] = $column;
490+
$columns[] = $column;
491491
}
492492

493493
return $columns;
@@ -626,10 +626,10 @@ protected function getChangeDefault(string $tableName, Column $newColumn): Alter
626626
*/
627627
protected function getChangeColumnInstructions(string $tableName, string $columnName, Column $newColumn): AlterInstructions
628628
{
629-
$columns = $this->getColumns($tableName);
629+
$column = $this->getColumn($tableName, $columnName);
630630
$changeDefault =
631-
$newColumn->getDefault() !== $columns[$columnName]->getDefault() ||
632-
$newColumn->getType() !== $columns[$columnName]->getType();
631+
$newColumn->getDefault() !== $column?->getDefault() ||
632+
$newColumn->getType() !== $column?->getType();
633633

634634
$instructions = new AlterInstructions();
635635

@@ -1382,4 +1382,25 @@ public function getDecoratedConnection(): Connection
13821382

13831383
return $this->decoratedConnection = $this->buildConnection(SqlServerDriver::class, $options);
13841384
}
1385+
1386+
/**
1387+
* Gets a table column
1388+
*
1389+
* @param string $tableName
1390+
* @param string $columnName
1391+
* @return \Phinx\Db\Table\Column|null
1392+
*/
1393+
private function getColumn(string $tableName, string $columnName): ?Column
1394+
{
1395+
$columns = $this->getColumns($tableName);
1396+
1397+
$filteredColumns = array_filter(
1398+
$columns,
1399+
static function ($column) use ($columnName) {
1400+
return $column->getName() === $columnName;
1401+
},
1402+
);
1403+
1404+
return array_pop($filteredColumns);
1405+
}
13851406
}

tests/Phinx/Db/Adapter/SqlServerAdapterTest.php

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,7 @@ public function testDropColumn()
691691
$this->assertFalse($this->adapter->hasColumn('t', 'column1'));
692692
}
693693

694-
public function columnsProvider()
694+
public static function columnsProvider(): array
695695
{
696696
return [
697697
['column1', 'string', ['null' => true, 'default' => null]],
@@ -718,7 +718,7 @@ public function columnsProvider()
718718
/**
719719
* @dataProvider columnsProvider
720720
*/
721-
public function testGetColumns($colName, $type, $options)
721+
public function testGetColumns($colName, $type, $options): void
722722
{
723723
$table = new Table('t', [], $this->adapter);
724724
$table
@@ -727,19 +727,23 @@ public function testGetColumns($colName, $type, $options)
727727

728728
$columns = $this->adapter->getColumns('t');
729729
$this->assertCount(2, $columns);
730-
$this->assertEquals($colName, $columns[$colName]->getName());
731-
$this->assertEquals($type, $columns[$colName]->getType());
730+
731+
$specificColumn = $this->getColumn('t', $colName);
732+
$this->assertNotNull($specificColumn);
733+
734+
$this->assertEquals($colName, $specificColumn->getName());
735+
$this->assertEquals($type, $specificColumn->getType());
732736

733737
if (isset($options['limit'])) {
734-
$this->assertEquals($options['limit'], $columns[$colName]->getLimit());
738+
$this->assertEquals($options['limit'], $specificColumn->getLimit());
735739
}
736740

737741
if (isset($options['precision'])) {
738-
$this->assertEquals($options['precision'], $columns[$colName]->getPrecision());
742+
$this->assertEquals($options['precision'], $specificColumn->getPrecision());
739743
}
740744

741745
if (isset($options['scale'])) {
742-
$this->assertEquals($options['scale'], $columns[$colName]->getScale());
746+
$this->assertEquals($options['scale'], $specificColumn->getScale());
743747
}
744748
}
745749

@@ -1663,4 +1667,18 @@ public function testInvalidPdoAttribute($attribute)
16631667
$this->expectExceptionMessage('Invalid PDO attribute: ' . $attribute . ' (\PDO::' . strtoupper($attribute) . ')');
16641668
$adapter->connect();
16651669
}
1670+
1671+
private function getColumn(string $tableName, string $columnName): ?Column
1672+
{
1673+
$columns = $this->adapter->getColumns($tableName);
1674+
1675+
$filteredColumns = array_filter(
1676+
$columns,
1677+
static function ($column) use ($columnName) {
1678+
return $column->getName() === $columnName;
1679+
},
1680+
);
1681+
1682+
return array_pop($filteredColumns);
1683+
}
16661684
}

0 commit comments

Comments
 (0)