Laravel移行で列をnullにできないようにする


126

nullable現在、テーブルの特定の列を作成するための移行を作成しています。ダウン機能については、もちろんこれらの列をnot nullableもう一度作成したいと思います。スキーマビルダーのドキュメントを調べましたが、これを行う方法がわかりませんでした。

任意の助けいただければ幸いです。


この質問の最も完全な答えは、こちらにあります:stackoverflow.com/a/32568625/4908847
szaman

回答:


227

Laravel 5以前は、スキーマビルダーを使用して既存のテーブル列を変更するLaravelネイティブの方法はありませんでした。これには、生のクエリを使用する必要があります。

ただし、Laravel 5以降では以下を使用できます。

$table->...->nullable(false)->change();

1
それも私が見つけたものです。スキーマビルダーは、サポートしていないように見える列の定義を変更できるようにするのがよいでしょう。ゼロからテーブルを作成するだけでなく、スキーマビルダーを使用して既存のDBを変更している私のような他の多くの人がいると思います。
Sean the Bean

3
Taylor Otwell(Laravelの作成者)は6日前(2014-05-09)に次のように述べています。github.com/laravel/framework/issues/895#issuecomment-42709756
Ryan

3
:@Musaはどうやらあなたは、列のNULL可能(EXを設定することができます$table->string('colmn', 255)->nullable()->change();が、逆は(仕事には表示されません)$table->string('colmn', 255)->change();あなたはまだこのため、生のDBクエリを使用する必要があるので、)
ルイス・クルーズ

5
以下の@MattMcDonaldの回答を参照してください。移行でnullable()を使用してnullableにし、nullable(false)を使用してNot nullableにすることができます。
ajon

5
nullable(false)Laravel 5.3では機能しません:(
Stalinko

38

Laravel 5以降では、これをネイティブに元に戻すことが可能です。nullable()の引数としてfalseを渡すだけです。

例えば

$table -> string('foo') -> nullable(false) -> change();

できます!Laravelの更新により、これは正しい答えになりました。
jlbang 2016年

ありがとう、デフォルトで列がnull不可にならない理由がわかりません。通常はこれがベストプラクティスであり、これによりコードに多くのノイズが追加されます。
モーガン

1
列はデフォルトでnull以外です。ポスターは、すでにnullの列を元に戻す方法を尋ねているだけでした。
マットマクドナルド

2

まずこれを実行します:

composer require doctrine/dbal

次に、テーブルを次のように変更する移行を作成します。

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->dropColumn('column');
    });
}

4
ロールバックルーチンで列全体を削除する理由はありますか?down()メソッドは、up()メソッドのロジックを元に戻し、マイグレーションの逆方向および順方向のローリングをサポートする必要があります。
Andrew

1

-> nullable()なしで列を再度宣言し、-> changeを使用することができます

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.