Tipo de dados personalizado no construtor de esquema Laravel

Recentemente, enfrentei alguns problemas com o construtor de esquema Laravel : ele não suporta o settipo 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::createpor $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.