2017-10-21 6 views
3

それはあなたがフィールドNULL可能日時列の名前を変更しようとすると、あなたが移行を実行する場合は、エラーになります場合mariadb 10.2.7での互換性に影響する変更がある表示されます。Laravel Migrationはnullableフィールドの回避策の名前を変更しますか?

[Illuminate\Database\QueryException] 
    SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'due_date' (SQL: ALTER TABLE test 
    CHANGE dueDate due_date DATETIME DEFAULT 'NULL') 

移行を作成します。

class CreateTestTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('test', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->dateTime('dueDate')->nullable(); 
     }); 
    } 
} 

class RenameColumn extends Migration 
{ 
    public function up() 
    { 
     Schema::table('test', function(Blueprint $table) { 
      $table->renameColumn('dueDate', 'due_date'); 
     }); 
    } 
} 

この作業を取得するための回避策があります:

は、列の名前を変更するために、第2の移行を作成しますか?

教義/ DBAL issueによると:

デフォルト値として表現を可能にし、それらをリテラルから を区別するために、Mariadbは今 information_schema.columnテーブルのデフォルト値を引用しています。この変更により、多くの は(Oracle-)Mysql/MariaDBプラットフォーム間の非互換性をもたらします。

代わりMariaDBに特異的SchemaManagerを作成する、このPで撮影溶液 /Rが現在 MySQLSchemaManager(:getMariaDb1027ColumnDefault()メソッド)に導入された変化をマッピングすることです。

MariaDB 10.2.7からは、情報スキーマの変更が含まれています:(columのデフォルトはNULL可能ではない で、デフォルトはありません場合は例外:NULLは INFORMATION_SCHEMAに保存されます)

NULLは現在 'NULL' として引用され、EDITを:例外を参照してください https://jira.mariadb.org/browse/MDEV-14053文字列の既定値は です(文字列 'NULL'を保存するには、 'NULL'として既定値を設定します)。エスケープ: "'"は情報スキーマの "' '"に自動的に変更されます。 モデル(スキーマ差分)の "'"を使用して手動でデフォルト値をエスケープしない限り、 は影響を受けません。また、ポイント5を参照してください。デフォルトのリテラル値 は、自動CURRENT_TIMESTAMP、 CURRENT_DATE、CURRENT_TIMEのサポートをもたらすために引用符で囲まなければなりません。 'current_timestamp()'、 'currdate()'、 'currtime()'。スキーマ diffを防止するために、元の値にマップされます。

+0

$ table-> renameColumn( 'dueDate'、 'due_date') - > nullable() 'を試したことがありますか? –

+0

カラムをnullにできないようにしようとしましたが、名前を変更してから再びヌルにすることができましたか? '$ table-> nullable(false) - > change()' –

答えて

1

あなたはこのアプローチを試みることができる:提供ソリューションは、私は単純なアプローチを好む動作しますが

class RenameColumn extends Migration 
{ 
    public function up() 
    { 
     Schema::table('test', function(Blueprint $table){ 
      $table->dateTime('due_date')->nullable(); 
     }); 

     // copy values from column 'dueDate' to 'due_date' 
     // DB::update returns number of affected rows 
     DB::update('UPDATE `test` SET due_date = dueDate'); 

     Schema::table('test', function(Blueprint $table){ 
      $table->dropColumn('dueDate'); 
     }); 
    } 

    public function down() 
    { 
     Schema::table('test', function(Blueprint $table){ 
      $table->dateTime('dueDate')->nullable(); 
     }); 

     DB::update('UPDATE `test` SET dueDate = due_date'); 

     Schema::table('test', function(Blueprint $table){ 
      $table->dropColumn('due_date'); 
     }); 
    } 
} 
0

あなたの新しい列に古い列の値をコピーし、新しい列と実行クエリを作成します。 :

public function up() 
{ 
    Schema::table('test', function (Blueprint $table) { 
     DB::statement('ALTER TABLE `test` CHANGE `dueDate` `due_date` TIMESTAMP NULL DEFAULT NULL;'); 
    }); 
} 

public function down() 
{ 
    Schema::table('test', function (Blueprint $table) { 
     DB::statement('ALTER TABLE `test` CHANGE `dueDate` `due_date` TIMESTAMP NULL DEFAULT NULL;'); 
    }); 
}