web-dev-qa-db-ja.com

Laravel移行により、列タイプがvarcharからlongTextに変更されます

$table->string('text');の移行列タイプをテキストタイプに変更する必要があります。いくつかの方法でそれを試みましたが、いずれも機能しませんでした。一度の移行でそれを行うことは可能ですか?列をドロップしてから新しいタイプで再度作成することはできますが、1回の移行でそれを行うことは可能でしょうか?

18
Marco

新しい移行を作成し、 1つの列タイプのみを変更

public function up()
{
    Schema::table('sometable', function (Blueprint $table) {
        $table->text('text')->change();
    });
}

この作業を行うには、doctrine/dbalをインストールする必要があります

composer require doctrine/dbal
30
Alexey Mezenin

Laravel Doc による

次のようにできます

Schema::table('yourTable', function (Blueprint $table) {
    $table->text('text')->change();
});

composer.jsonファイルにdoctrine/dbal依存関係を必ず追加してください

6
zorx

TABLE移行を行うことは可能です。

他の投稿で述べたように、必ずプロジェクトルートからcomposer install doctrine/dbalを実行してください。

これらは次のものでセットアップされます。

php artisan make:migration alter_table_[yourtablenamehere]_change_[somecolumnname] --table=[yourtablenamehere]

プロジェクトのルートから。

ドキュメントから:

https://laravel.com/docs/master/migrations#modifying-columns

class AlterTableSomething extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('table', function (Blueprint $table) {
            $table->text('column_name')->change();
        });
    }
}

change()を使用して次のエラーが発生した場合

不明なデータベースタイプの列挙が要求されました。Doctrine\ DBAL\Platforms\MySQL80Platformはそれをサポートしていない可能性があります。

これは、enumタイプを持つテーブルに何らかの列(必ずしも変更された列ではない)が存在することを意味します。したがって、代わりにchange()を使用して、次の関数を使用できます。

_public function changeColumnType($table, $column, $newColumnType) {                
    DB::statement("ALTER TABLE $table CHANGE $column $column $newColumnType");
} 
_

そして、そのように使用します:$this->changeColumnType('sometable','text','TEXT');

2