2014-05-06 21 views
10

Czy istnieje sposób, aby dokonać migracji danych w Laravel? Znalazłem kilka instrukcji dotyczących rozsiewania bazy danych, ale nie obejmuje to przypadków, w których muszę podzielić jedno pole na kilka pól lub scalić wiele pól w jeden.Laravel migracji danych

Jednym z możliwych rozwiązań jest zapytanie do bazy danych i aktualizacja każdego rekordu w pętli. Problem z tym podejściem polega na tym, że modele mogą nie odzwierciedlać schematu tabeli podczas migracji (Django provides a solution for this).

Odpowiedz

27

laravel ma migracje zbudowane w :) http://laravel.com/docs/migrations

Wystarczy uruchomić

php artisan migrate:make migration_name_here 

i stworzy migrację pod app/database/migracje. Następnie można użyć klas bazy danych Laravel w metodach up() i down().

Użyjmy to jako przykład ...

class SplitColumn extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::table('table_name', function($table) 
     { 
      // Create new columns for table_name (1 column split into 2). 
      $table->string('new_column'); 
      $table->string('new_column_b'); 
     }); 

     // Get records from old column. 
     $results = DB::table('table_name')->select('old_column')->get(); 

     // Loop through the results of the old column, split the values. 
     // For example, let's say you have to explode a |. 
     foreach($results as $result) 
     { 
      $split_value = explode("|", $result->old_column); 

      // Insert the split values into new columns. 
      DB::table('table_name')->insert([ 
       "new_column" => $split_value[0], 
       "new_column_b" => $split_value[1] 
      ]); 
     } 

     // Delete old column. 
     Schema::table('table_name', function($table) 
     { 
      $table->dropColumn('old_column'); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::table('table_name', function($table) 
     { 
      // Re-create the old column. 
      $table->string('old_column'); 
     }); 

     // Get records from old column. 
     $results = DB::table('table_name')->select('new_column', 'new_column_b')->get(); 

     // Loop through the results of the new columns and merge them. 
     foreach($results as $result) 
     { 
      $merged_value = implode("|", [$result->new_column, $result->new_column_b]); 

      // Insert the split values into re-made old column. 
      DB::table('table_name')->insert([ 
       "old_column" => $merged_value 
      ]); 
     } 

     // Delete new columns. 
     Schema::table('table_name', function($table) 
     { 
      $table->dropColumn('new_column'); 
      $table->dropColumn('new_column_b'); 
     }); 
    } 
} 
+0

Problem z tym rozwiązaniem polega na tym, że jeśli istnieje wiele rekordów, będziesz musiał wykonać wiele zapytań, po jednym dla każdego rekordu w bazie danych i zakładasz, że w łańcuchu jest dokładnie jedna rura. Powinien być sposób na zrobienie tego przy pomocy jednego lub dwóch zapytań –

-1

Po to jest stałe i prawdopodobnie najlepsza możliwa odpowiedź Chciałbym po prostu utworzyć zestaw zapytań w swoim ulubionym narzędziem bazy danych tak:

enter image description here

To proste rozwiązanie, jeśli nie pracujesz w zespole. Migracja jest zdecydowanie lepsza, ale czasami zestaw zapytań będzie szybszy.

Powiązane problemy