2014-02-27 81 views
11

我需要將整數更改爲外鍵的兩個字段。我如何構建我的遷移來執行此操作?如何使用Laravel架構構建器更改列類型?

Schema::create('messages', function($table) 
{ 
    $table->increments('id'); 
    $table->integer('sender'); 
    $table->integer('recipient'); 
    $table->string('title'); 
    $table->longtext('body'); 
    $table->timestamps(); 
    $table->softDeletes(); 
    $table->integer('regarding'); 
}); 

我會改變sendersender_idrecipientrecipient_idregardingregarding_id

回答

0

您可以嘗試將列重命名爲$table->renameColumn('from', 'to');,然後使用標準外鍵創建新列,最後將數據從臨時列複製到具有控制器功能的新列。 應該工作,但我沒有嘗試,沒有需要。

+0

我已經完成了上述工作,它可以同時工作:)。 – Ben

7

我遇到了類似的問題,需要將列類型從字符串更改爲整數。我使用兩個單獨的遷移(每個都使用RAW sql語句)來管理此問題,以獲得解決方案。

此外,這適用於Postgres和MySQL,因爲我們處於傳輸過程中。

第一遷移:

/** 
* Run the migrations. 
* 
* @return void 
*/ 
public function up() 
{ 
    Schema::table('plans', function(Blueprint $table) 
    { 
     // 
     $table->mediumInteger('duration_change_type')->default(0)->after('duration'); 
    }); 

    if (Config::get('database')['default'] === 'mysql'){ 
     // Mysql 
     DB::statement('update plans set duration_change_type=duration'); 

    } else if (Config::get('database')['default'] === 'pgsql'){ 
     // PostgreSQL 
     DB::statement('update plans set duration_change_type=duration::integer'); 
    } 
} 

/** 
* Reverse the migrations. 
* 
* @return void 
*/ 
public function down() 
{ 
    Schema::table('plans', function(Blueprint $table) 
    { 
     // 
     $table->dropColumn('duration_change_type'); 
    }); 
} 

第二遷移:

/** 
* Run the migrations. 
* 
* @return void 
*/ 
public function up() 
{ 
    Schema::table('plans', function(Blueprint $table) 
    { 
     // 
     $table->dropColumn('duration'); 
     $table->renameColumn('duration_change_type', 'duration'); 
    }); 
} 

/** 
* Reverse the migrations. 
* 
* @return void 
*/ 
public function down() 
{ 
    Schema::table('plans', function(Blueprint $table) 
    { 
     // Rollback to string 
     $table->string('duration_change_type')->default(0)->after('duration'); 
    }); 
    if (Config::get('database')['default'] === 'mysql'){ 
     // Mysql 
     DB::statement('update plans set duration_change_type=duration'); 

    } else if (Config::get('database')['default'] === 'pgsql'){ 
     // PostgreSQL 
     DB::statement('update plans set duration_change_type=duration::text'); 
    } 
} 

在此思考現在它可以被簡化成一個單一的遷移。

+1

謝謝,本。我會修補那個。 – mike

3

我剛剛遇到同樣的問題,最快的解決方案是簡單地更改數據庫上的列結構,然後改變原始遷移以反映對數據庫所做的更改。

通過這種方式,如果遷移曾經回滾,然後再次上升,正確的字段將被創建。只要您確保準確更改遷移,我就看不到任何不利之處。

+3

如果您只部署到一臺服務器,那沒問題,但是如果您部署到10臺服務器,您是否會逐個更改該列? –

7

不要想太多,我使用下面的代碼。在這裏,我將數據類型從varchar更改爲文本。

public function up(){ 
    DB::statement('ALTER TABLE items MODIFY COLUMN item_description TEXT'); 
    DB::statement('ALTER TABLE items MODIFY COLUMN delivery_description TEXT'); 
} 

public function down(){ 
    DB::statement('ALTER TABLE items MODIFY COLUMN item_description VARCHAR(255)'); 
    DB::statement('ALTER TABLE items MODIFY COLUMN delivery_description VARCHAR(255)'); 
} 
+0

這不適用於Postgres,你必須使用這個: DB :: statement('ALTER TABLE items ALTER COLUMN item_description TYPE VARCHAR(20)'); – hdomos

2

如果要更改列類型或修改長度等,只需調用change()方法

Schema::table('users', function ($table) { 
    $table->string('id')->change(); 
}); 

和重命名列

Schema::table('users', function ($table) { 
    $table->renameColumn('from', 'to'); 
}); 
0

我只想砸和然後將其重新添加爲不同的類型。

0

在Laravel 5中,您可以使用如下的閉包。這應該以與數據庫無關的方式執行,因此不需要使用if語句來檢查數據庫類型。

(請注意,您可能需要作曲家需要學說/ DBAL做到這一點。)

public function up() { 
    Schema::table('plans', function($t) { 
     $t->renameColumn('duration_change_type', 'duration'); 
    }); 
} 

public function down() { 
    Schema::table('plans', function($t) { 
     $t->renameColumn('duration', 'duration_change_type'); 
    }); 
} 
0

我有一個類似的問題,試圖列類型更改從文本到二進制文件。嘗試運行遷移命令時出現錯誤。 我最終以這種方式解決了這個問題:

public function up() 
{ 
    Schema::table('user', function (Blueprint $table) { 
     $table->dropColumn('address'); 
    }); 
    Schema::table('user', function (Blueprint $table) { 
     $table->binary('address')->nullable(); 
    }); 
}