2014-06-18 8 views

risposta

9

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.

+0

Ha funzionato per me! – markdwhite

+1

Perché non aggiungere semplicemente la tabella in seguito (usando una chiamata 'DB :: statement')? Perché lo aggiungi, quindi lo altera? – ajon

+0

@ ajon Buona domanda. Ho fatto così per mantenere l'uso di 'DB :: statement' al minimo. – Debiprasad

11

Fase 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.

+0

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

+0

L'ho capito. Stavo usando 'Schema :: create (...)' invece di $ schema-> create (...) – gin93r

4

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