Laravel迁移表字段的类型更改

时间:2015-10-05 02:33:32

标签: php laravel migration

以下是我的文件 2015_09_14_051851_create_orders_table.php 。 我希望将$table->integer('category_id');更改为带有新迁移的字符串。

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateOrdersTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('orders', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('num');
            $table->integer('user_id');

            $table->text('store_name');
            $table->integer('store_name_publication');

            $table->string('postal_code', 255);
            $table->string('phone_number', 255);

            $table->text('title');
            $table->text('description');

            $table->string('list_image_filename1', 255);
            $table->string('list_image_filename2', 255)->nullable();
            $table->string('list_image_filename3', 255)->nullable();
            $table->string('list_image_filename4', 255)->nullable();
            $table->string('list_image_filename5', 255)->nullable();

            $table->integer('term');

            $table->datetime('state0_at')->nullable();
            $table->datetime('state1_at')->nullable();
            $table->datetime('state2_at')->nullable();
            $table->datetime('state3_at')->nullable();
            $table->datetime('state4_at')->nullable();
            $table->datetime('state5_at')->nullable();
            $table->datetime('state6_at')->nullable();
            $table->datetime('state7_at')->nullable();
            $table->datetime('state8_at')->nullable();
            $table->datetime('state9_at')->nullable();
            $table->datetime('state10_at')->nullable();

            $table->integer('category_id');
            $table->integer('target_customer_sex');
            $table->integer('target_customer_age');

            $table->integer('payment_order');
            $table->integer('num_comment');
            $table->integer('num_view');
            $table->string('num_pop');

            $table->integer('money');
            $table->integer('point');

            $table->datetime('closed_at');
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('orders');
    }

}

7 个答案:

答案 0 :(得分:68)

更新:2018年10月31日,仍可在laravel 5.7 https://laravel.com/docs/5.7/migrations#modifying-columns

上使用

要对现有数据库进行一些更改,您可以在迁移中使用change()修改列类型。

这是你可以做的

Schema::table('orders', function ($table) {
    $table->string('category_id')->change();
});

请注意,您需要将 doctrine / dbal 依赖项添加到composer.json 有关详细信息,请访问http://laravel.com/docs/5.1/migrations#modifying-columns

答案 1 :(得分:34)

TEXT 中的类型更改为 LONGTEXT 时,standard solution对我不起作用。

我必须这样:

public function up()
{
    DB::statement('ALTER TABLE mytable MODIFY mycolumn  LONGTEXT;');
}

public function down()
{
    DB::statement('ALTER TABLE mytable MODIFY mycolumn TEXT;');
}

这可能是一个学说问题。更多信息here

另一种方法是使用string()方法,并将值设置为文本类型max length:

    Schema::table('mytable', function ($table) {
        // Will set the type to LONGTEXT.
        $table->string('mycolumn', 4294967295)->change();
    });

答案 2 :(得分:7)

第一个作曲家需要getSnapshotBeforeUpdate,然后:

doctrine/dbal

答案 3 :(得分:5)

2018解决方案,其他答案仍然有效,但您不需要使用任何依赖项

首先,您必须创建一个新的迁移:

php artisan make:migration change_appointment_time_column_type

然后在该迁移文件up()中,尝试:

    Schema::table('appointments', function ($table) {
        $table->string('time')->change();
    });

如果不更改大小,则默认值为varchar(191),但如果要更改字段的大小,则为:

    Schema::table('appointments', function ($table) {
        $table->string('time', 40)->change();
    });

然后通过以下方式迁移文件:

php artisan migrate

more info from doc

答案 4 :(得分:1)

所有其他答案都是正确的但是在运行之前

php artisan migrate

确保您首先运行此代码

composer require doctrine/dbal

为避免此错误

  

RuntimeException:更改表“ items”的列需要Doctrine DBAL;安装   “学说/ dbal”。

答案 5 :(得分:0)

对我来说,解决方案只是将 unsigned 替换为 index

这是完整的代码:

await

答案 6 :(得分:0)

并不是真正的答案,而只是关于->change()的注释:

仅以下列类型可以“更改”:bigInteger,二进制,布尔值,日期,dateTime,dateTimeTz,十进制,整数,json,longText,mediumText,smallInteger,字符串,文本,时间,unsignedBigInteger,unsignedInteger和unsignedSmallInteger。

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

如果您的列不是其中之一,则需要删除该列或使用其他答案中提到的alter语句。