php - seeder - ¿Cuál es el tipo de datos MySQL SET equivalente en Laravel Schema?
migration laravel (4)
Paso 1. Amplíe las clases predeterminadas (agregue este código a su archivo de migración después de use
secciones):
class ExtendedBlueprint extends Blueprint {
/**
* Create a new set column on the table.
*
* @param string $column
* @param array $allowed
* @return /Illuminate/Support/Fluent
*/
public function set($column, array $allowed)
{
return $this->addColumn(''set'', $column, compact(''allowed''));
}
}
class ExtendedMySqlGrammar extends Illuminate/Database/Schema/Grammars/MySqlGrammar {
/**
* Create the column definition for an set type.
*
* @param /Illuminate/Support/Fluent $column
* @return string
*/
protected function typeSet(/Illuminate/Support/Fluent $column)
{
return "set(''".implode("'', ''", $column->allowed)."'')";
}
}
Paso 2. Luego, debemos cambiar las clases predeterminadas de gramática y diseño a nuestra medida:
// set new grammar class
DB::connection()->setSchemaGrammar(new ExtendedMySqlGrammar());
// get custom schema object
$schema = DB::connection()->getSchemaBuilder();
// bind new blueprint class
$schema->blueprintResolver(function($table, $callback) {
return new ExtendedBlueprint($table, $callback);
});
// then create tables
$schema->create(''table name'', function(ExtendedBlueprint $table)
{
$table->increments(''id'');
$table->text(''sentence'');
$table->string(''author'')->nullable();
$table->string(''source'')->nullable();
$table->set(''difficulty'', range(1, 10)); // use our new mysql type
$table->boolean(''enabled'')->default(true);
});
Este método también funcionará después de la composer update
, porque no editamos ningún código de marco.
Laravel Schema tiene un comando para ENUM equivalente a la tabla. ¿Cuál es el SET equivalente a la tabla?
De acuerdo con la API de Laravel, no creo que sea posible crear un conjunto usando Schema Builder.
Fuente: http://laravel.com/api/class-Illuminate.Database.Schema.Blueprint.html
A partir de ahora, Laravel Schema Builder no admite SET tipo de datos para columnas. Entonces, aquí hay una solución alternativa hasta que alguien agregue esos códigos a Laravel.
Paso 1: crea la tabla, utiliza ENUM en lugar de SET.
Schema::create(''schools'', function($table)
{
$table->increments(''id'');
$table->char(''id_number'', 6);
$table->string(''school_name'');
$table->enum(''level'', array(''Preschool'', ''Kindergarten'', ''Primary'', ''Secondary''))->index(); // *** fix this
$table->string(''phone'');
$table->string(''email'');
$table->string(''location'');
$table->smallInteger(''city'')->unsigned()->index();
$table->smallInteger(''country'')->unsigned()->index();
$table->smallInteger(''head_teacher'')->unsigned()->index();
$table->smallInteger(''director'')->unsigned()->index();
$table->smallInteger(''created_by'')->unsigned();
$table->smallInteger(''modified_by'')->unsigned();
$table->timestamps();
});
Ahora cambia ENUM a SET.
$table_prefix = DB::getTablePrefix();
DB::statement("ALTER TABLE `" . $table_prefix . "schools` CHANGE `level` `level` SET(''Preschool'',''Kindergarten'',''Primary'',''Secondary'');");
Si tiene una mejor solución, hágamelo saber.
El método de Roman Nazarkin funciona casi perfectamente, sin embargo, hay un pequeño problema con los prefijos de tabla (que este método no explica), pero es simple hacer que esta sugerencia funcione con los prefijos de la tabla:
$grammar = DB::connection()->withTablePrefix(new ExtendedMySqlGrammar());
// set new grammar class
DB::connection()->setSchemaGrammar($grammar);
// get custom schema object
$schema = DB::connection()->getSchemaBuilder();
// bind new blueprint class
$schema->blueprintResolver(function($table, $callback) {
return new ExtendedBlueprint($table, $callback);
});
// then create tables
$schema->create(''table name'', function(ExtendedBlueprint $table)
{
$table->increments(''id'');
$table->text(''sentence'');
$table->string(''author'')->nullable();
$table->string(''source'')->nullable();
$table->set(''difficulty'', range(1, 10)); // use our new mysql type
$table->boolean(''enabled'')->default(true);
});