Recentemente, enfrentei alguns problemas com o construtor de esquema Laravel : ele não suporta o set
tipo de dados mysql , que era necessário para um de meus projetos. Depois de alguma busca por qualquer informação sobre isso, descobri uma maneira de implementar tipos de dados personalizados no construtor de esquema. É um pouco feio, mas funciona bem;)
1. Estenda as classes ‘Grammar’ e ‘Blueprint’
Coloque este código no início do seu arquivo de migração:
use IlluminateSupportFluent;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaGrammarsMySqlGrammar;
/**
* Extended version of MySqlGrammar with
* support of 'set' data type
*/
class ExtendedMySqlGrammar extends MySqlGrammar {
/**
* Create the column definition for an 'set' type.
*
* @param IlluminateSupportFluent $column
* @return string
*/
protected function typeSet(Fluent $column)
{
return "set('".implode("', '", $column->allowed)."')";
}
}
/**
* Extended version of Blueprint with
* support of 'set' data type
*/
class ExtendedBlueprint extends Blueprint {
/**
* Create a new 'set' column on the table.
*
* @param string $column
* @param array $allowed
* @return IlluminateSupportFluent
*/
public function set($column, array $allowed)
{
return $this->addColumn('set', $column, compact('allowed'));
}
}
2. Substitua as classes padrão de gramática e blueprint pelas nossas
Insira este código antes de usar Schema::create
:
// register new grammar class
DB::connection()->setSchemaGrammar(new ExtendedMySqlGrammar());
$schema = DB::connection()->getSchemaBuilder();
// replace blueprint
$schema->blueprintResolver(function($table, $callback) {
return new ExtendedBlueprint($table, $callback);
});
em seguida, substitua Schema::create
por $schema->create
, assim:
$schema->create('example_table', function(ExtendedBlueprint $table)
{
$table->increments('id');
$table->text('sentence');
// text source & author
$table->string('author')->nullable();
$table->string('source')->nullable();
// technical data
$table->set('difficulty', range(1, 10)); // use new datatype
$table->boolean('enabled')->default(true);
});
Isso é tudo, pessoal 😉
PS. Desculpe pelo meu inglês, ainda estou estudando.