33 private $elementFactory;
38 private $dbSchemaReader;
62 $this->elementFactory = $elementFactory;
63 $this->dbSchemaReader = $dbSchemaReader;
64 $this->sharding = $sharding;
72 foreach ($this->sharding->getResources() as
$resource) {
86 $table = $this->elementFactory->create(
91 'engine' => strtolower($tableOptions[
'engine']),
92 'comment' => $tableOptions[
'comment'] ===
'' ?
null : $tableOptions[
'comment'],
93 'charset' => $tableOptions[
'charset'],
94 'collation' => $tableOptions[
'collation']
99 foreach ($columnsData as $columnData) {
100 $columnData[
'table'] =
$table;
101 $column = $this->elementFactory->create($columnData[
'type'], $columnData);
102 $columns[$column->getName()] = $column;
107 foreach ($indexesData as $indexData) {
108 $indexData[
'table'] =
$table;
109 $indexData[
'columns'] = $this->resolveInternalRelations(
$columns, $indexData);
110 $index = $this->elementFactory->create(
'index', $indexData);
114 foreach ($constrainsData as $constraintData) {
115 $constraintData[
'table'] =
$table;
116 $constraintData[
'columns'] = $this->resolveInternalRelations(
$columns, $constraintData);
117 $constraint = $this->elementFactory->create($constraintData[
'type'], $constraintData);
121 $table->addIndexes($indexes);
122 $table->addConstraints($constraints);
127 $this->processReferenceKeys($this->tables,
$schema);
137 private function processReferenceKeys(array $tables, Schema
$schema)
139 foreach ($tables as
$table) {
144 $referencesData = $this->dbSchemaReader->readReferences(
$tableName,
$table->getResource());
147 foreach ($referencesData as $referenceData) {
149 $referenceData[
'table'] =
$table;
150 $referenceTableName = $referenceData[
'referenceTable'];
151 $referenceData[
'column'] =
$table->getColumnByName($referenceData[
'column']);
152 $referenceData[
'referenceTable'] = $this->tables[$referenceTableName];
153 $referenceData[
'referenceColumn'] = $referenceData[
'referenceTable']->getColumnByName(
154 $referenceData[
'referenceColumn']
157 $references[$referenceData[
'name']] = $this->elementFactory->create(
'foreign', $referenceData);
159 if (isset($tables[$referenceTableName]) && $referenceTableName !==
$tableName) {
160 $this->processReferenceKeys([$referenceTableName => $tables[$referenceTableName]],
$schema);
161 unset($tables[$referenceTableName]);
165 $table->addConstraints($references);
178 private function resolveInternalRelations(array
$columns, array
$data)
180 if (!is_array(
$data[
'column'])) {
182 new Phrase(
"Cannot find columns for internal index")
186 $referenceColumns = [];
187 foreach (
$data[
'column'] as $columnName) {
188 if (!isset(
$columns[$columnName])) {
192 'Column %1 does not exist for index/constraint %2 in table %3.',
202 $referenceColumns[] =
$columns[$columnName];
206 return $referenceColumns;
__construct(ElementFactory $elementFactory, DbSchemaReaderInterface $dbSchemaReader, Sharding $sharding)