getColumns($blueprint)); $sql = 'create table '.$this->wrapTable($blueprint); if (isset($blueprint->systemName)) { $sql .= ' for system name '.$blueprint->systemName; } $sql .= " ($columns)"; return $sql; } /** * Compile a label command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @param \Illuminate\Database\Connection $connection * @return string */ public function compileLabel(Blueprint $blueprint, Fluent $command, Connection $connection) { return 'label on table '.$this->wrapTable($blueprint).' is \'' . $command->label . '\''; } /** * Compile the blueprint's column definitions. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @return array */ protected function getColumns(Blueprint $blueprint) { $columns = []; foreach ($blueprint->getColumns() as $column) { // Each of the column types have their own compiler functions which are tasked // with turning the column definition into its SQL format for this platform // used by the connection. The column's modifiers are compiled and added. //$sql = $this->wrap($column).' '.$this->getType($column); $sql = $this->addPreModifiers($this->wrap($column), $blueprint, $column); $sql .= ' '.$this->getType($column); $columns[] = $this->addModifiers($sql, $blueprint, $column); } return $columns; } /** * Add the column modifiers to the definition. * * @param string $sql * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string */ protected function addPreModifiers($sql, Blueprint $blueprint, Fluent $column) { foreach ($this->preModifiers as $preModifier) { if (method_exists($this, $method = "modify{$preModifier}")) { $sql .= $this->{$method}($blueprint, $column); } } return $sql; } /** * Compile a create table command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileAdd(Blueprint $blueprint, Fluent $command) { $table = $this->wrapTable($blueprint); $columns = $this->prefixArray('add', $this->getColumns($blueprint)); foreach ($columns as $column) { $statements[] = 'alter table '.$table.' '.$column; } return $statements; } /** * Compile a primary key command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compilePrimary(Blueprint $blueprint, Fluent $command) { $table = $this->wrapTable($blueprint); $columns = $this->columnize($command->columns); // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Primary $schemaTable = explode(".", $table); if (count($schemaTable) > 1) { $command->index = str_replace($schemaTable[0]."_", "", $command->index); } return "alter table {$table} add constraint {$command->index} primary key ({$columns})"; } /** * Compile a foreign key command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileForeign(Blueprint $blueprint, Fluent $command) { $table = $this->wrapTable($blueprint); $on = $this->wrapTable($command->on); // We need to prepare several of the elements of the foreign key definition // before we can create the SQL, such as wrapping the tables and convert // an array of columns to comma-delimited strings for the SQL queries. $columns = $this->columnize($command->columns); $onColumns = $this->columnize((array) $command->references); // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Foreign $schemaTable = explode(".", $table); if (count($schemaTable) > 1) { $command->index = str_replace($schemaTable[0]."_", "", $command->index); } $sql = "alter table {$table} add constraint {$command->index} "; $sql .= "foreign key ({$columns}) references {$on} ({$onColumns})"; // Once we have the basic foreign key creation statement constructed we can // build out the syntax for what should happen on an update or delete of // the affected columns, which will get something like "cascade", etc. if ( ! is_null($command->onDelete)) { $sql .= " on delete {$command->onDelete}"; } if ( ! is_null($command->onUpdate)) { $sql .= " on update {$command->onUpdate}"; } return $sql; } /** * Compile a unique key command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileUnique(Blueprint $blueprint, Fluent $command) { $table = $this->wrapTable($blueprint); $columns = $this->columnize($command->columns); // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Unique $schemaTable = explode(".", $table); if (count($schemaTable) > 1) { $command->index = str_replace($schemaTable[0]."_", "", $command->index); } return "alter table {$table} add constraint {$command->index} unique({$columns})"; } /** * Compile a plain index key command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileIndex(Blueprint $blueprint, Fluent $command) { $table = $this->wrapTable($blueprint); $columns = $this->columnize($command->columns); // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Index $schemaTable = explode(".", $table); if (count($schemaTable) > 1) { $command->index = str_replace($schemaTable[0]."_", "", $command->index); } $sql = "create index {$command->index}"; if ($command->indexSystem) { $sql .= " for system name {$command->indexSystem}"; } $sql .= " on {$table}($columns)"; //return "create index {$command->index} for system name on {$table}($columns)"; return $sql; } /** * Compile a drop table command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileDrop(Blueprint $blueprint, Fluent $command) { return 'drop table '.$this->wrapTable($blueprint); } /** * Compile a drop table (if exists) command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileDropIfExists(Blueprint $blueprint, Fluent $command) { return 'drop table if exists '.$this->wrapTable($blueprint); } /** * Compile a drop column command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileDropColumn(Blueprint $blueprint, Fluent $command) { $columns = $this->prefixArray('drop', $this->wrapArray($command->columns)); $table = $this->wrapTable($blueprint); return 'alter table '.$table.' '.implode(', ', $columns); } /** * Compile a drop primary key command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileDropPrimary(Blueprint $blueprint, Fluent $command) { return 'alter table '.$this->wrapTable($blueprint).' drop primary key'; } /** * Compile a drop unique key command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileDropUnique(Blueprint $blueprint, Fluent $command) { $table = $this->wrapTable($blueprint); // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Unique $schemaTable = explode(".", $table); if (count($schemaTable) > 1) { $command->index = str_replace($schemaTable[0]."_", "", $command->index); } return "alter table {$table} drop index {$command->index}"; } /** * Compile a drop index command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileDropIndex(Blueprint $blueprint, Fluent $command) { $table = $this->wrapTable($blueprint); // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Index $schemaTable = explode(".", $table); if (count($schemaTable) > 1) { $command->index = str_replace($schemaTable[0]."_", "", $command->index); } return "alter table {$table} drop index {$command->index}"; } /** * Compile a drop foreign key command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileDropForeign(Blueprint $blueprint, Fluent $command) { $table = $this->wrapTable($blueprint); // Aucune utilité d'avoir le nom du schéma dans le nom de la contrainte Foreign $schemaTable = explode(".", $table); if (count($schemaTable) > 1) { $command->index = str_replace($schemaTable[0]."_", "", $command->index); } return "alter table {$table} drop foreign key {$command->index}"; } /** * Compile a rename table command. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $command * @return string */ public function compileRename(Blueprint $blueprint, Fluent $command) { $from = $this->wrapTable($blueprint); return "rename table {$from} to ".$this->wrapTable($command->to); } /** * Create the column definition for a char type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeChar(Fluent $column) { return "char({$column->length})"; } /** * Create the column definition for a string type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeString(Fluent $column) { return "varchar({$column->length})"; } /** * Create the column definition for a text type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeText(Fluent $column) { return 'text'; } /** * Create the column definition for a medium text type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeMediumText(Fluent $column) { return 'mediumtext'; } /** * Create the column definition for a long text type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeLongText(Fluent $column) { return 'longtext'; } /** * Create the column definition for a big integer type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeBigInteger(Fluent $column) { return 'bigint'; } /** * Create the column definition for a integer type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeInteger(Fluent $column) { return 'int'; } /** * Create the column definition for a small integer type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeSmallInteger(Fluent $column) { return 'smallint'; } /** * Create the column definition for a numeric type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeNumeric(Fluent $column) { return "numeric({$column->total}, {$column->places})"; } /** * Create the column definition for a float type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeFloat(Fluent $column) { return "float({$column->total}, {$column->places})"; } /** * Create the column definition for a double type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeDouble(Fluent $column) { if ($column->total && $column->places) { return "double({$column->total}, {$column->places})"; } else { return 'double'; } } /** * Create the column definition for a decimal type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeDecimal(Fluent $column) { return "decimal({$column->total}, {$column->places})"; } /** * Create the column definition for a boolean type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeBoolean(Fluent $column) { return 'smallint constraint '.$column->type.'_'.$column->prefix.'_'.$column->name.' check('.$column->name.' in(0,1))'.(is_null($column->default) ? ' default 0' : ''); } /** * Create the column definition for an enum type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeEnum(Fluent $column) { return "enum('".implode("', '", $column->allowed)."')"; } /** * Create the column definition for a date type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeDate(Fluent $column) { if ( ! $column->nullable) return 'date default current_date'; return 'date'; } /** * Create the column definition for a date-time type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeDateTime(Fluent $column) { return 'datetime'; } /** * Create the column definition for a time type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeTime(Fluent $column) { if ( ! $column->nullable) return 'time default current_time'; return 'time'; } /** * Create the column definition for a timestamp type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeTimestamp(Fluent $column) { if ( ! $column->nullable) return 'timestamp default current_timestamp'; return 'timestamp'; } /** * Create the column definition for a binary type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeBinary(Fluent $column) { return 'blob'; } /** * Get the SQL for a nullable column modifier. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string|null */ protected function modifyNullable(Blueprint $blueprint, Fluent $column) { return $column->nullable ? '' : ' not null'; } /** * Get the SQL for a default column modifier. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string|null */ protected function modifyDefault(Blueprint $blueprint, Fluent $column) { if ( ! is_null($column->default)) { return " default ".$this->getDefaultValue($column->default); } } /** * Get the SQL for an auto-increment column modifier. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string|null */ protected function modifyIncrement(Blueprint $blueprint, Fluent $column) { if (in_array($column->type, $this->serials) && $column->autoIncrement) { return ' as identity'; } } /** * Get the SQL for an "before" column modifier. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string|null */ protected function modifyBefore(Blueprint $blueprint, Fluent $column) { if ( ! is_null($column->before)) { return ' before '.$this->wrap($column->before); } } /** * Get the SQL for an "for column" column modifier. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string|null */ protected function modifyForColumn(Blueprint $blueprint, Fluent $column) { if ( ! is_null($column->forColumn)) { return ' for column '.$this->wrap($column->forColumn); } } /** * Get the SQL for a "generated" column modifier. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string|null */ protected function modifyGenerated(Blueprint $blueprint, Fluent $column) { if ( ! is_null($column->generated)) { return ' generated '.($column->generated === true ? 'always' : $this->wrap($column->generated)); } } /** * Get the SQL for a "startWith" column modifier. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string|null */ protected function modifyStartWith(Blueprint $blueprint, Fluent $column) { if ( ! is_null($column->startWith)) { return ' (start with '.$column->startWith.')'; } } /** * Get the SQL for an "implicitly hidden" column modifier. * * @param \Illuminate\Database\Schema\Blueprint $blueprint * @param \Illuminate\Support\Fluent $column * @return string|null */ protected function modifyImplicitlyHidden(Blueprint $blueprint, Fluent $column) { if ( ! is_null($column->implicitlyHidden)) { return ' implicitly hidden'; } } /** * Format a value so that it can be used in "default" clauses. * * @param mixed $value * @return string */ protected function getDefaultValue($value) { if ($value instanceof Expression || is_bool($value) || is_numeric($value)) return $value; return "'".strval($value)."'"; } }