web-dev-qa-db-ja.com

laravel移行により列の順序が再編成される

テーブルに新しい列を作成するときは、-> after( 'column name')を使用して、どこに移動するかを指定できます。列を正しい順序で並べ替える移行を作成するにはどうすればよいですか?

33
user391986

これを試してください、それがあなたが正しい解決策を見つけるのに役立つことを願っています:

public function up()
{

    DB::statement("ALTER TABLE example MODIFY COLUMN foo DATE AFTER bar");

}

public function down()
{

    DB::statement("ALTER TABLE example MODIFY COLUMN foo DATE AFTER bar");

}
22
Odin Thunder

データを破壊せずに実行したい場合は、スキーマの更新と同時にデータを移行できます。

use DB;

public function up()
{
    //Give the moving column a temporary name:
    Schema::table('users', function($table)
    {
        $table->renameColumn('name', 'name_old');
    });

    //Add a new column with the regular name:
    Schema::table('users', function(Blueprint $table)
    {
        $table->string('name')->after('city');
    });

    //Copy the data across to the new column:
    DB::table('users')->update([
        'name' => DB::raw('name_old')   
    ]);

    //Remove the old column:
    Schema::table('users', function(Blueprint $table)
    {
        $table->dropColumn('name_old');
    });
}
19
Robert

私はDB :: query( '.. raw sql query ..');をお勧めします。そして、「 MySQLテーブルの列を移動する方法 」という回答のクエリを使用します。

6
Rob Gordijn

列名がaddressで、その位置をcityという別の列の後に来るように並べ替え、テーブル名がemployeesであるとします。

端末で次のコマンドを入力します。

_php artisan migrate:make reorganize_order_of_column_address --table=employees
_

_reorganize_order_of_column_address_とemployeesは必要に応じてのみ変更できますが、残りのコマンドはそのままにしておきます。

これにより、_app/database/migrations_フォルダーに移行ファイルが生成され、それが開き、次のようにup()関数内にコードが配置されます。

_public function up()
{
    Schema::table('employees', function(Blueprint $table)
    {
        $table->dropColumn("address");
    });

    Schema::table('employees', function(Blueprint $table)
    {
        $table->string('address')->after("city");
    });
}
_

このメソッドは列とそこに格納されていたすべてのデータを削除し、検出した列の後に同じ名前で新しい列を作成し、新しく作成された列は空になることに注意してください。

この方法はLaravel 4.2で機能しましたが、Laravel 5でも機能する可能性がありますが、ターミナルに入力する必要があるコマンドにいくつかの変更があります。

2
Amr