Laravel Schema ha un comando per ENUM equivalente alla tabella. Qual è il SET equivalente al tavolo?Qual è il tipo di dati MySQL SET equivalente in Laravel Schema?
risposta
A partire da ora laravel Schema Builder non supporta tipo di dati per le colonne SET. Quindi, ecco una soluzione alternativa fino a quando qualcuno non aggiungerà quel codice a Laravel.
Passaggio 1: Creare la tabella, utilizzare ENUM anziché 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();
});
Ora modificare ENUM su SET.
$table_prefix = DB::getTablePrefix();
DB::statement("ALTER TABLE `" . $table_prefix . "schools` CHANGE `level` `level` SET('Preschool','Kindergarten','Primary','Secondary');");
Se si dispone di una soluzione migliore, quindi fatemelo sapere.
In base all'API Laravel, non penso sia possibile creare un set utilizzando Schema Builder.
Fonte
: http://laravel.com/api/class-Illuminate.Database.Schema.Blueprint.htmlFase 1. Estendere classi di default (aggiungere il codice al tuo file di migrazione dopo use
sezioni):
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)."')";
}
}
Fase 2. Poi, abbiamo bisogno di cambiare lezioni di grammatica e blueprint di default al nostro personalizzato:
// 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);
});
Questo metodo funziona anche dopo composer update
, perché non abbiamo editato alcun codice del framework.
Ho ricevuto un errore quando lo faccio. 'L'argomento 1 passato a CreateTableName :: {closure}() deve essere un'istanza di ExtendedBlueprint, istanza di Illuminate \ Database \ Schema \ Blueprint fornita. Qualche idea? Ho cambiato Blueprint in ExtendedBlueprint nel mio callback di creazione. – gin93r
L'ho capito. Stavo usando 'Schema :: create (...)' invece di $ schema-> create (...) – gin93r
metodo di Roman Nazarkin funziona quasi perfettamente Tuttavia c'è un piccolo problema con prefissi di tabella (che questo metodo non tiene conto) è semplice ma per fare questo lavoro il suggerimento con prefissi di tabella:
$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);
});
Ha funzionato per me! – markdwhite
Perché non aggiungere semplicemente la tabella in seguito (usando una chiamata 'DB :: statement')? Perché lo aggiungi, quindi lo altera? – ajon
@ ajon Buona domanda. Ho fatto così per mantenere l'uso di 'DB :: statement' al minimo. – Debiprasad