Added foreign key support to schema builder for MySQL, Postgres, and SQL Server.
Signed-off-by: Taylor Otwell <taylorotwell@gmail.com>
This commit is contained in:
parent
2032dec0ea
commit
1302ded5f8
|
@ -197,6 +197,39 @@ protected function key(Table $table, Fluent $command, $type)
|
|||
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 @@ protected function key(Table $table, Fluent $command, $unique = false)
|
|||
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 @@ protected function key(Table $table, Fluent $command, $unique = false)
|
|||
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 @@ public function index($columns, $name = null)
|
|||
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.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue