protected function appendForeignKeys() { if ($this->table->disableForeignKeys) { return; } foreach ($this->table->getForeignKeys() as $foreignKey) { $this->fkLines->commaExpr($this->database()->getUtility()->generateForeignKeyExpression($foreignKey)); } }
/** * @return bool */ public function apply() { if (self::$enableStateCache && isset(self::$applied[$this->table->entityClassName])) { if ($this->log) { $this->log->push(Expression::create('# Migration for table ? (?) already applied, skipping', $this->table->schemaName, $this->table->entityClassName)); } return true; } /** @var Migration[] $dependentMigrations */ $dependentMigrations = array(); foreach ($this->table->getForeignKeys() as $foreignKey) { $referenceMigration = $foreignKey->getReferencedTable()->migration(); $referenceMigration->dryRun = $this->dryRun; $referenceMigration->log = $this->log; $dependentMigrations[$referenceMigration->table->schemaName] = $referenceMigration; } try { $statement = $this->checkRun(); if ($dependentMigrations) { $fkStatement = $statement->extractForeignKeysStatement(); if (!$this->applyRequired($statement)) { return false; } $this->runStatement($statement); self::setApplied($this->table->entityClassName); if ($this->log) { $this->log->push('# Dependent tables found: ' . implode(', ', array_keys($dependentMigrations))); } foreach ($dependentMigrations as $migration) { $migration->apply(); } $this->runStatement($fkStatement); } else { if (!$this->applyRequired($statement)) { return false; } $this->runStatement($statement); } if ($this->log) { $this->log->push('# OK', Log::TYPE_SUCCESS); } } catch (Exception $exception) { if ($this->log) { $this->log->push($exception->getMessage(), Log::TYPE_ERROR); } return false; } return true; }
protected function processForeignKeys() { /** @var ForeignKey[] $beforeForeignKeys */ $beforeForeignKeys = array(); if (!$this->before->disableForeignKeys) { foreach ($this->before->getForeignKeys() as $foreignKey) { $beforeForeignKeys[$foreignKey->getName()] = $foreignKey; } } $afterForeignKeys = $this->after->getForeignKeys(); if ($this->after->disableForeignKeys) { $afterForeignKeys = array(); } foreach ($afterForeignKeys as $foreignKey) { if (!isset($beforeForeignKeys[$foreignKey->getName()])) { $this->addFkExpression->commaExpr('ADD'); $this->addFkExpression->appendExpr($this->database()->getUtility()->generateForeignKeyExpression($foreignKey)); } else { unset($beforeForeignKeys[$foreignKey->getName()]); } } foreach ($beforeForeignKeys as $foreignKey) { $this->alterLines->commaExpr('DROP FOREIGN KEY ?', new Symbol($foreignKey->getName())); } }