Issues (13)

src/Helpers/DBFakerSchemaManager.php (1 issue)

Severity
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: kevin
5
 * Date: 26/06/18
6
 * Time: 18:21
7
 */
8
9
namespace DBFaker\Helpers;
10
11
use DBFaker\Exceptions\SchemaLogicException;
12
use Doctrine\DBAL\Schema\AbstractSchemaManager;
13
use Doctrine\DBAL\Schema\Column;
14
use Doctrine\DBAL\Schema\Table;
15
16
class DBFakerSchemaManager
17
{
18
    /**
19
     * @var mixed[]
20
     */
21
    private $foreignKeyMappings;
22
23
    /**
24
     * @var AbstractSchemaManager
25
     */
26
    private $schemaManager;
27
28
    /**
29
     * DBFakerSchemaManager constructor.
30
     * @param AbstractSchemaManager $schemaManager
31
     */
32
    public function __construct(AbstractSchemaManager $schemaManager)
33
    {
34
        $this->schemaManager = $schemaManager;
35
    }
36
37
38
    /**
39
     * @param Table $table
40
     * @param Column $column
41
     * @return Column
42
     * @throws \DBFaker\Exceptions\SchemaLogicException
43
     * @throws \Doctrine\DBAL\Schema\SchemaException
44
     */
45
    public function getForeignColumn(Table $table, Column $column) : Column
46
    {
47
        if (isset($this->foreignKeyMappings[$table->getName()][$column->getName()])) {
48
            return $this->foreignKeyMappings[$table->getName()][$column->getName()]["column"];
49
        }
50
51
        $lookupColumn = null;
52
        $foreignKeys = $table->getForeignKeys();
53
        foreach ($foreignKeys as $foreignKeyConstraint) {
54
            $localColumns = $foreignKeyConstraint->getLocalColumns();
55
            $foreignColumns = $foreignKeyConstraint->getForeignColumns();
56
            $foreignTable = $this->schemaManager->listTableDetails($foreignKeyConstraint->getForeignTableName());
57
            foreach ($localColumns as $index => $localColumn) {
58
                $foreignColumn = $foreignColumns[$index];
59
                $this->foreignKeyMappings[$table->getName()][$localColumn] = ["table" => $foreignTable, "column" => $foreignTable->getColumn($foreignColumn)];
60
                if ($localColumn === $column->getName()) {
61
                    $lookupColumn = $foreignTable->getColumn($foreignColumn);
62
                }
63
            }
64
        }
65
66
        if (!$lookupColumn) {
0 ignored issues
show
$lookupColumn is of type null, thus it always evaluated to false.
Loading history...
67
            throw new SchemaLogicException("Could not find foreign column for local column '".$table->getName().".".$column->getName()."'");
68
        }
69
        return $lookupColumn;
70
    }
71
}
72