specific seeder incorrectly formed foreign delete create constraint column php mysql database laravel schema

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?



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); });