2016-05-27 14 views
6

Ho bisogno di aggiungere una nuova colonna nel mio progetto laravel, nessun problema, ho usato il Schema::table() per l'aggiornamento ed è ok. Ora ho bisogno di scoprire quanti record ho su questa tabella e di aggiornare con un certo valore.Aggiorna tabella e aggiungi dati in una migrazione di Laravel 5

mi hanno la tabella Warrants:

Schema::create('warrant_grants', function(Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('warrant_plan_id'); 
     $table->integer('shareholder_id'); 
}); 

così ho creato il nuovo campo con un nuovo file di migrazione:

Schema::table('warrant_grants',function ($table){ 
     $table->string('name',100); 
    }); 

Ora ho bisogno di aggiornare questo campo name nella tabella con alcuni valori , ad esempio se la tabella ha 100 record, quindi devo inserire in ogni riga il valore "Warrant-X" dove X è un numero che inizia con 1 a 100. Ad esempio:

Warrant-1, Warrant-2, .... Warrant-100.

Ho passato ore a cercare un modo per farlo usando Seeds ma non l'ho trovato. Quindi fondamentalmente ho due domande:

  • Posso usare Seeds in Laravel 5 per aggiornare i valori o posso semplicemente inserirli?
  • Posso creare un po 'di SQL all'interno di Seeds (o migrazioni) per fare questo aggiornamento per me?
+0

È possibile aggiornare i valori nella migrazione. –

risposta

5

Sì, è possibile eseguire aggiornamenti/inserti/qualsiasi cosa nelle proprie migrazioni. Per esempio:

Schema::table('warrant_grants', function($table) { 
    $table->string('name', 100); 
}); 

$i = 1; 
foreach (WarrantGrants::all() as $warrant_grant) { 
    $warrant_grant->update([ 
     'name' => 'Warrant-' . $i 
    ]); 

    $i++; 
} 
3

In base a questo link ho trovato la risposta: https://stackoverflow.com/a/23506744/4650792

Schema::table('warrant_grants',function ($table){ 
     $table->string('name',100)->after('id')->nullable(); 
    }); 

    $results = DB::table('warrant_grants')->select('id','name')->get(); 

    $i = 1; 
    foreach ($results as $result){ 
     DB::table('warrant_grants') 
      ->where('id',$result->id) 
      ->update([ 
       "name" => "Warrant-".$i 
     ]); 
     $i++; 
    } 

Grazie per l'aiuto comunque ragazzi.

2

Altre risposte sono corrette. Ma ricorda che se hai molti record, l'aggiornamento di tutti loro con ORM può richiedere tempo. Utilizzare query SQL raw per farlo più velocemente.

Schema::table('warrant_grants',function ($table){ 
     $table->string('name',100)->after('id')->nullable(); 
    }); 
DB::raw("UPDATE warrant_grants SET name=name+id"); 

La query SQL non è esatta, e devi farlo per il tuo DB, ma ottieni il punto.

Problemi correlati