Programing

열이 널 입력 가능하도록 Laravel 마이그레이션 변경

crosscheck 2020. 5. 29. 07:57
반응형

열이 널 입력 가능하도록 Laravel 마이그레이션 변경


unsigned로 마이그레이션을 만들었습니다 user_id. user_id새 마이그레이션에서 편집 하여 어떻게 만들 수 nullable()있습니까?

Schema::create('throttle', function(Blueprint $table)
{
    $table->increments('id');
    // this needs to also be nullable, how should the next migration be?
    $table->integer('user_id')->unsigned();
}

Laravel 5는 이제 열 변경을 지원합니다. 다음은 공식 문서의 예입니다.

Schema::table('users', function($table)
{
    $table->string('name', 50)->nullable()->change();
});

출처 : http://laravel.com/docs/5.0/schema#changing-columns

Laravel 4는 열 수정을 지원하지 않으므로 원시 SQL 명령 작성과 같은 다른 기술을 사용해야합니다. 예를 들면 다음과 같습니다.

// getting Laravel App Instance
$app = app();

// getting laravel main version
$laravelVer = explode('.',$app::VERSION);

switch ($laravelVer[0]) {

    // Laravel 4
    case('4'):

        DB::statement('ALTER TABLE `pro_categories_langs` MODIFY `name` VARCHAR(100) NULL;');
        break;

    // Laravel 5, or Laravel 6
    default:                

        Schema::table('pro_categories_langs', function(Blueprint $t) {
            $t->string('name', 100)->nullable()->change();
        });               

}

이미 데이터를 추가 한 열을 편집하려고한다고 가정하므로 데이터를 잃지 않고 열을 삭제하고 nullable 열로 다시 추가 할 수 없습니다. 우리는 alter기존 열입니다.

그러나 Laravel의 스키마 빌더는 열 이름 바꾸기 이외의 열 수정을 지원하지 않습니다. 따라서 다음과 같이 원시 쿼리를 실행해야합니다.

function up()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
}

마이그레이션을 계속 롤백 할 수 있도록 down()하기도합니다.

function down()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

한 가지 참고 사항은 nullable과 nullable을 변환 할 수 없으므로 마이그레이션 전 / 후에 데이터를 정리해야합니다. 따라서 마이그레이션 스크립트에서 두 가지 방법으로 수행하십시오.

function up()
{
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
    DB::statement('UPDATE `throttle` SET `user_id` = NULL WHERE `user_id` = 0;');
}

function down()
{
    DB::statement('UPDATE `throttle` SET `user_id` = 0 WHERE `user_id` IS NULL;');
    DB::statement('ALTER TABLE `throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

미래 독자를위한 완벽한 답변입니다. 이것은 Laravel 5 이상에서만 가능합니다.

우선 교리 / dbal 패키지 가 필요합니다 .

composer require doctrine/dbal

이제 마이그레이션에서 열을 nullable로 만들 수 있습니다.

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        // change() tells the Schema builder that we are altering a table
        $table->integer('user_id')->unsigned()->nullable()->change();
    });
}

이 작업을 되 돌리는 방법이 궁금 할 것입니다. 슬프게도이 구문은 지원되지 않습니다.

// Sadly does not work :'(
$table->integer('user_id')->unsigned()->change();

마이그레이션을 되 돌리는 올바른 구문입니다.

$table->integer('user_id')->unsigned()->nullable(false)->change();

Or, if you prefer, you can write a raw query:

public function down()
{
    /* Make user_id un-nullable */
    DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
    DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

Hopefully you'll find this answer useful. :)


He're the full migration for Laravel 5:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->unsignedInteger('user_id')->nullable()->change();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->unsignedInteger('user_id')->nullable(false)->change();
    });
}

The point is, you can remove nullable by passing false as an argument.


If you happens to change the columns and stumbled on

'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

then just install

composer require doctrine/dbal


Adding to Dmitri Chebotarev's answer, as for Laravel 5+.

After requiring the doctrine/dbal package:

composer require doctrine/dbal

You can then make a migration with nullable columns, like so:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        // change() tells the Schema builder that we are altering a table
        $table->integer('user_id')->unsigned()->nullable()->change();
    });
}

To revert the operation, do:

public function down()
{
    /* turn off foreign key checks for a moment */
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    /* set null values to 0 first */
    DB::statement('UPDATE `users` SET `user_id` = 0 WHERE `user_id` IS NULL;');
    /* alter table */
    DB::statement('ALTER TABLE `users` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
    /* finally turn foreign key checks back on */
    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}

Adding to Dmitri Chebotarev Answer,

If you want to alter multiple columns at a time , you can do it like below

DB::statement('
     ALTER TABLE `events` 
            MODIFY `event_date` DATE NOT NULL,
            MODIFY `event_start_time` TIME NOT NULL,
            MODIFY `event_end_time` TIME NOT NULL;
');

Try it:

$table->integer('user_id')->unsigned()->nullable();

For Laravel 4.2, Unnawut's answer above is the best one. But if you are using table prefix, then you need to alter your code a little.

function up()
{
    $table_prefix = DB::getTablePrefix();
    DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NULL;');
}

And to make sure you can still rollback your migration, we'll do the down() as well.

function down()
{
    $table_prefix = DB::getTablePrefix();
    DB::statement('ALTER TABLE `' . $table_prefix . 'throttle` MODIFY `user_id` INTEGER UNSIGNED NOT NULL;');
}

참고URL : https://stackoverflow.com/questions/24419999/laravel-migration-change-to-make-a-column-nullable

반응형