output .= $this->createNodeRelation(
$fkConstraint->getLocalTableName() . ':col' . current($fkConstraint->getLocalColumns()) . ':se',
$fkConstraint->getForeignTableName() . ':col' . current($fkConstraint->getForeignColumns()) . ':se',
[
'dir' => 'back',
'arrowtail' => 'dot',
'arrowhead' => 'normal',
]
);
}
/**
* {@inheritdoc}
*/
public function acceptSchema(Schema $schema)
{
$this->output = 'digraph "' . sha1(mt_rand()) . '" {' . "\n";
$this->output .= 'splines = true;' . "\n";
$this->output .= 'overlap = false;' . "\n";
$this->output .= 'outputorder=edgesfirst;' . "\n";
$this->output .= 'mindist = 0.6;' . "\n";
$this->output .= 'sep = .2;' . "\n";
}
/**
* {@inheritdoc}
*/
public function acceptTable(Table $table)
{
$this->output .= $this->createNode(
$table->getName(),
[
'label' => $this->createTableLabel($table),
'shape' => 'plaintext',
]
);
}
/**
* @return string
*/
private function createTableLabel(Table $table)
{
// Start the table
$label = '<
';
// The title
$label .= '' . $table->getName() . ' |
';
// The attributes block
foreach ($table->getColumns() as $column) {
$columnLabel = $column->getName();
$label .= '';
$label .= '';
$label .= '' . $columnLabel . '';
$label .= ' | ' . strtolower($column->getType()) . ' | ';
$label .= '';
if ($table->hasPrimaryKey() && in_array($column->getName(), $table->getPrimaryKey()->getColumns())) {
$label .= "\xe2\x9c\xb7";
}
$label .= ' |
';
}
// End the table
$label .= '
>';
return $label;
}
/**
* @param string $name
* @param string[] $options
*
* @return string
*/
private function createNode($name, $options)
{
$node = $name . ' [';
foreach ($options as $key => $value) {
$node .= $key . '=' . $value . ' ';
}
$node .= "]\n";
return $node;
}
/**
* @param string $node1
* @param string $node2
* @param string[] $options
*
* @return string
*/
private function createNodeRelation($node1, $node2, $options)
{
$relation = $node1 . ' -> ' . $node2 . ' [';
foreach ($options as $key => $value) {
$relation .= $key . '=' . $value . ' ';
}
$relation .= "]\n";
return $relation;
}
/**
* Get Graphviz Output
*
* @return string
*/
public function getOutput()
{
return $this->output . '}';
}
/**
* Writes dot language output to a file. This should usually be a *.dot file.
*
* You have to convert the output into a viewable format. For example use "neato" on linux systems
* and execute:
*
* neato -Tpng -o er.png er.dot
*
* @param string $filename
*
* @return void
*/
public function write($filename)
{
file_put_contents($filename, $this->getOutput());
}
}