DBAL-18: Doctrine\DBAL\Schema\SchemaDiff generates foreign keys statments for new tables even if the database platform doesn't support them #1346

Closed
doctrinebot opened this Issue Jun 6, 2010 · 3 comments

2 participants

@doctrinebot

Jira issue originally created by user eriksencosta:

When running the code snippets of http://www.doctrine-project.org/projects/dbal/2.0/docs/reference/schema-representation/en, I found that Doctrine\DBAL\Schema\SchemaDiff generates foreign keys statments for new tables even if the database plataform doesn't support them. My connection is a pdo_sqlite.

<?php
$schema = new \Doctrine\DBAL\Schema\Schema();

// Doctrine\DBAL\Schema\Schema pode ser usado para criar representações do
// schema, como a criação de tabelas
$myTable = $schema->createTable('my_table');
$myTable->addColumn('id', 'integer', array('unsigned' => true));
$myTable->addColumn("username", "string", array("length" => 32));
$myTable->setPrimaryKey(array("id"));
$myTable->addUniqueIndex(array("username"));

// SQLite does not supports sequences.
//$schema->createSequence("my*table*seq");

// Clone just to test Doctrine\DBAL\Schema\Comparator
$fromSchema = clone $schema;

$myForeign = $schema->createTable("my_foreign");
$myForeign->addColumn("id", "integer");
$myForeign->addColumn("user_id", "integer");
$myForeign->addForeignKeyConstraint($myTable, array("user_id"), array("id"), array("onUpdate" => "CASCADE"));

$queries = $schema->toSql($conn1->getDatabasePlatform()); // get queries to create this schema.
$dropSchema = $schema->toDropSql($conn1->getDatabasePlatform()); // get queries to safely delete this schema.

var_dump($queries);
var_dump($dropSchema);


$comparator = new \Doctrine\DBAL\Schema\Comparator();
$schemaDiff = $comparator->compare($fromSchema, $schema);

$queries     = $schemaDiff->toSql($conn1->getDatabasePlatform());     // queries to get from one to another schema.
$saveQueries = $schemaDiff->toSaveSql($conn1->getDatabasePlatform());

var_dump($queries);
var_dump($saveQueries);
?>

Both var_dump calls will output something like this:

array(2) {
  [0]=>
  string(71) "CREATE TABLE my*foreign (user*id INTEGER NOT NULL, id INTEGER NOT NULL)"
  [1]=>
  string(105) "ALTER TABLE my*foreign ADD CONSTRAINT my_foreign_user_id_fk FOREIGN KEY (user_id) REFERENCES my*table(id)"
}
@doctrinebot

Comment created by eriksencosta:

I have this fixed in mine github fork, 'DBAL-18' topic branch: http://github.com/eriksencosta/dbal/tree/[DBAL-18](http://www.doctrine-project.org/jira/browse/DBAL-18).

I added an extra if statment to check if the platform supports foreign keys constraints and updated the test case also.

In the test case, I didn't created an extra test method because I found it very related to the first if statment of the method Doctrine\DBAL\Schema\SchemaDiff::_toSql().

@doctrinebot

Comment created by @beberlei:

Merged into DBAL Master, will be released with BETA 2

@doctrinebot

Issue was closed with resolution "Fixed"

@doctrinebot doctrinebot added the Bug label Dec 6, 2015
@beberlei beberlei was assigned by doctrinebot Dec 6, 2015
@doctrinebot doctrinebot added this to the 2.0.0-BETA2 milestone Dec 6, 2015
@doctrinebot doctrinebot closed this Dec 6, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment