Cleaning up foreign key support. Added drop_foreign command.
Signed-off-by: Taylor Otwell <taylorotwell@gmail.com>
This commit is contained in:
parent
2f2437a0e3
commit
1d93cab0d0
|
@ -6,14 +6,60 @@
|
||||||
abstract class Grammar extends \Laravel\Database\Grammar {
|
abstract class Grammar extends \Laravel\Database\Grammar {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the appropriate data type definition for the column.
|
* 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);
|
||||||
|
|
||||||
|
$sql = "ALTER TABLE $table ADD CONSTRAINT $name ";
|
||||||
|
|
||||||
|
return $sql .= "FOREIGN KEY ($foreign) REFERENCES $on ($referenced)";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop a constraint from the table.
|
||||||
|
*
|
||||||
|
* @param Table $table
|
||||||
|
* @param Fluent $fluent
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function drop_constraint(Table $table, Fluent $command)
|
||||||
|
{
|
||||||
|
return "ALTER TABLE ".$this->wrap($table)." DROP CONSTRAINT ".$command->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the SQL syntax for indicating if a column is unsigned.
|
||||||
|
*
|
||||||
|
* @param Table $table
|
||||||
* @param Fluent $column
|
* @param Fluent $column
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function type(Fluent $column)
|
protected function unsigned(Table $table, Fluent $column)
|
||||||
{
|
{
|
||||||
return $this->{'type_'.$column->type}($column);
|
if ($column->type == 'integer' && $column->unsigned)
|
||||||
|
{
|
||||||
|
return ' UNSIGNED';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,18 +86,14 @@ public function wrap($value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the SQL syntax for indicating if a column is unsigned.
|
* Get the appropriate data type definition for the column.
|
||||||
*
|
*
|
||||||
* @param Table $table
|
|
||||||
* @param Fluent $column
|
* @param Fluent $column
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function unsigned(Table $table, Fluent $column)
|
protected function type(Fluent $column)
|
||||||
{
|
{
|
||||||
if ($column->type == 'integer' && $column->unsigned)
|
return $this->{'type_'.$column->type}($column);
|
||||||
{
|
|
||||||
return ' UNSIGNED';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -197,39 +197,6 @@ protected function key(Table $table, Fluent $command, $type)
|
||||||
return 'ALTER TABLE '.$this->wrap($table)." ADD {$type} {$name}({$keys})";
|
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.
|
* Generate the SQL statement for a drop table command.
|
||||||
*
|
*
|
||||||
|
@ -325,6 +292,18 @@ protected function drop_key(Table $table, Fluent $command)
|
||||||
return 'ALTER TABLE '.$this->wrap($table)." DROP INDEX {$command->name}";
|
return 'ALTER TABLE '.$this->wrap($table)." DROP INDEX {$command->name}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop a foreign key constraint from the table.
|
||||||
|
*
|
||||||
|
* @param Table $table
|
||||||
|
* @param Fluent $fluent
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function drop_foreign(Table $table, Fluent $command)
|
||||||
|
{
|
||||||
|
return $this->drop_constraint($table, $command);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate the data-type definition for a string.
|
* Generate the data-type definition for a string.
|
||||||
*
|
*
|
||||||
|
|
|
@ -198,39 +198,6 @@ protected function key(Table $table, Fluent $command, $unique = false)
|
||||||
return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})";
|
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.
|
* Generate the SQL statement for a drop table command.
|
||||||
*
|
*
|
||||||
|
@ -287,7 +254,7 @@ public function drop_primary(Table $table, Fluent $command)
|
||||||
*/
|
*/
|
||||||
public function drop_unique(Table $table, Fluent $command)
|
public function drop_unique(Table $table, Fluent $command)
|
||||||
{
|
{
|
||||||
return "ALTER TABLE ".$this->wrap($table)." DROP CONSTRAINT ".$command->name;
|
return $this->drop_constraint($table, $command);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -326,6 +293,18 @@ protected function drop_key(Table $table, Fluent $command)
|
||||||
return 'DROP INDEX '.$command->name;
|
return 'DROP INDEX '.$command->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop a foreign key constraint from the table.
|
||||||
|
*
|
||||||
|
* @param Table $table
|
||||||
|
* @param Fluent $fluent
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function drop_foreign(Table $table, Fluent $command)
|
||||||
|
{
|
||||||
|
return $this->drop_constraint($table, $command);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate the data-type definition for a string.
|
* Generate the data-type definition for a string.
|
||||||
*
|
*
|
||||||
|
|
|
@ -212,39 +212,6 @@ protected function key(Table $table, Fluent $command, $unique = false)
|
||||||
return $create." INDEX {$command->name} ON ".$this->wrap($table)." ({$columns})";
|
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.
|
* Generate the SQL statement for a drop table command.
|
||||||
*
|
*
|
||||||
|
@ -344,6 +311,18 @@ protected function drop_key(Table $table, Fluent $command)
|
||||||
return "DROP INDEX {$command->name} ON ".$this->wrap($table);
|
return "DROP INDEX {$command->name} ON ".$this->wrap($table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop a foreign key constraint from the table.
|
||||||
|
*
|
||||||
|
* @param Table $table
|
||||||
|
* @param Fluent $fluent
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function drop_foreign(Table $table, Fluent $command)
|
||||||
|
{
|
||||||
|
return $this->drop_constraint($table, $command);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate the data-type definition for a string.
|
* Generate the data-type definition for a string.
|
||||||
*
|
*
|
||||||
|
|
|
@ -207,6 +207,17 @@ public function drop_index($name)
|
||||||
return $this->drop_key(__FUNCTION__, $name);
|
return $this->drop_key(__FUNCTION__, $name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop a foreign key constraint from the table.
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function drop_foreign($name)
|
||||||
|
{
|
||||||
|
return $this->drop_key(__FUNCTION__, $name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a command to drop any type of index.
|
* Create a command to drop any type of index.
|
||||||
*
|
*
|
||||||
|
@ -216,7 +227,7 @@ public function drop_index($name)
|
||||||
*/
|
*/
|
||||||
protected function drop_key($type, $name)
|
protected function drop_key($type, $name)
|
||||||
{
|
{
|
||||||
return $this->command($type, array('name' => $name));
|
return $this->command($type, compact('name'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue