Commit 1302ded5 authored by Taylor Otwell's avatar Taylor Otwell

Added foreign key support to schema builder for MySQL, Postgres, and SQL Server.

Signed-off-by: 's avatarTaylor Otwell <taylorotwell@gmail.com>
parent 2032dec0
......@@ -197,6 +197,39 @@ class MySQL extends Grammar {
return 'ALTER TABLE '.$this->wrap($table)." ADD {$type} {$name}({$keys})";
}
/**
* Generate the SQL statement for creating a foreign key.
*
* @param Table $table
* @param Command $command
* @return string
*/
public function foreign(Table $table, Fluent $command)
{
$name = $command->name;
// We need to wrap both of the table names in quoted identifiers to protect
// against any possible keyword collisions, both the table on which the
// command is being executed and the referenced table are wrapped.
$table = $this->wrap($table);
$on = $this->wrap($command->on);
// Next we need to columnize both the command table's columns as well as
// the columns referenced by the foreign key. We'll cast the referenced
// columns to an array since they aren't by the fluent command.
$foreign = $this->columnize($command->columns);
$referenced = $this->columnize((array) $command->references);
// Finally we can built the SQL. This should be the same for all database
// platforms we support, but we'll just keep it in the grammars since
// adding foreign keys using ALTER isn't supported by SQLite.
$sql = "ALTER TABLE $table ADD CONSTRAINT $name ";
die($sql .= "FOREIGN KEY ($foreign) REFERENCES $on ($referenced)");
}
/**
* Generate the SQL statement for a drop table command.
*
......
......@@ -194,6 +194,39 @@ class Postgres extends Grammar {
return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})";
}
/**
* Generate the SQL statement for creating a foreign key.
*
* @param Table $table
* @param Command $command
* @return string
*/
public function foreign(Table $table, Fluent $command)
{
$name = $command->name;
// We need to wrap both of the table names in quoted identifiers to protect
// against any possible keyword collisions, both the table on which the
// command is being executed and the referenced table are wrapped.
$table = $this->wrap($table);
$on = $this->wrap($command->on);
// Next we need to columnize both the command table's columns as well as
// the columns referenced by the foreign key. We'll cast the referenced
// columns to an array since they aren't by the fluent command.
$foreign = $this->columnize($command->columns);
$referenced = $this->columnize((array) $command->references);
// Finally we can built the SQL. This should be the same for all database
// platforms we support, but we'll just keep it in the grammars since
// adding foreign keys using ALTER isn't supported by SQLite.
$sql = "ALTER TABLE $table ADD CONSTRAINT $name ";
die($sql .= "FOREIGN KEY ($foreign) REFERENCES $on ($referenced)");
}
/**
* Generate the SQL statement for a drop table command.
*
......
......@@ -212,6 +212,39 @@ class SQLServer extends Grammar {
return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})";
}
/**
* Generate the SQL statement for creating a foreign key.
*
* @param Table $table
* @param Command $command
* @return string
*/
public function foreign(Table $table, Fluent $command)
{
$name = $command->name;
// We need to wrap both of the table names in quoted identifiers to protect
// against any possible keyword collisions, both the table on which the
// command is being executed and the referenced table are wrapped.
$table = $this->wrap($table);
$on = $this->wrap($command->on);
// Next we need to columnize both the command table's columns as well as
// the columns referenced by the foreign key. We'll cast the referenced
// columns to an array since they aren't by the fluent command.
$foreign = $this->columnize($command->columns);
$referenced = $this->columnize((array) $command->references);
// Finally we can built the SQL. This should be the same for all database
// platforms we support, but we'll just keep it in the grammars since
// adding foreign keys using ALTER isn't supported by SQLite.
$sql = "ALTER TABLE $table ADD CONSTRAINT $name ";
die($sql .= "FOREIGN KEY ($foreign) REFERENCES $on ($referenced)");
}
/**
* Generate the SQL statement for a drop table command.
*
......
......@@ -108,6 +108,17 @@ class Table {
return $this->key(__FUNCTION__, $columns, $name);
}
/**
* Add a foreign key constraint to the table.
*
* @param string|array $columns
* @param string $name
*/
public function foreign($columns, $name = null)
{
return $this->key(__FUNCTION__, $columns, $name);
}
/**
* Create a command for creating any index.
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment