2017-06-21 65 views
-1

我有一個名爲listings的表,它當前包含一個名爲closed的列,數據類型爲integer。該列僅包含兩個值,即1NULL在Laravel遷移中使用新創建的列

現在,我需要修改此列的數據類型爲timestamp,但根據documentation這是不可能的,對於timestamp數據類型是不可能的。我還想將此列的值設置爲前一個值爲1NULL(如果前一個值包含NULL)的當前日期。

這裏是我的這一戰略:

  • 創建一個名爲closed_temp有當前日期
  • 設置closed_temp的默認值NULL新列的地方closedNULL
  • closed
  • 重命名closed_temp列爲closed

這裏是我的代碼:

public function up() 
{ 
    Schema::table('listings', function (Blueprint $table) { 
     $table->timestamp('closed_temp')->default(\Carbon\Carbon::now())->nullable(); 
     $listings = Listing::all(); 
     foreach ($listings as $listing) { 
      if(!isset($listing->closed)) { 
       $listing->closed_temp = NULL; 
       $listing->save(); 
      } 
     } 
    }); 
} 

但是,這給了我一些錯誤:

[照亮\數據庫\ QueryException]
SQLSTATE [42S22]:列未找到:1054未知'field_list'中的列'closed_temp' (SQL:更新listings集合updated_at = 2017-06-21 04:50:5 8,closed_temp =其中listing_id = 3)

[學說\ DBAL \驅動\ PDOException]
SQLSTATE [42S22]:在 '字段列表'

[PDOException]
SQLSTATE [42S22] 1054未知列 'closed_temp' :列列未找到未找到:1054未知列'closed_temp' in'字段列表'

是否有任何方式在遷移中使用新創建的列?如果沒有,還有什麼其他的選擇?我也試過運行一個raw_sql查詢,但得到了同樣的錯誤。

回答

-1

我解決了這個問題,通過創建兩個單獨的遷移文件,這樣做的migration order是很重要的,因爲它創造了一個新列closed_temp遷移文件必須包含邏輯用於更新closed_temp列,然後重命名遷移文件前運行它到closed

兩個遷移文件如下複製:

class AlterListingsTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::table('listings', function (Blueprint $table) { 
      $table->timestamp('closed_temp')->default(\Carbon\Carbon::now())->nullable(); 
     });   

    } 
} 

class AlterListingsClosedFieldTable extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::table('listings', function (Blueprint $table) { 
      $listings = Listing::all(); 
      foreach ($listings as $key => $listing) { 
       if(!isset($listing->closed)) { 
        $listing->closed_temp = NULL; 
        $listing->save(); 
       } 
      } 
      $table->dropColumn('closed'); 
      $table->renameColumn('closed_temp', 'closed'); 
     }); 
    } 
}