Laravel 8 - 更改现有迁移

Posted

技术标签:

【中文标题】Laravel 8 - 更改现有迁移【英文标题】:Laravel 8 - Change existing migration 【发布时间】:2021-07-01 10:31:24 【问题描述】:

我正在Laravel Framework 8.33.1 上进行开发,并在我的本地环境和生产环境中进行了以下迁移。

class CreateCompanyTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('company', function (Blueprint $table) 
            $table->id();
            $table->integer('company_id');
            $table->integer('messageId');
            $table->string('url');
            $table->timestamps();

            /**
            New table:
            $table->id();
            $table->integer('company_id')->nullable($value = true);
            $table->integer('messageId');
            $table->integer('people_id')->nullable($value = true);
            $table->string('url')->nullable($value = true);
            $table->timestamps();
             */
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('company');
    


我想使用以下适应字段更改迁移:

            $table->id();
            $table->integer('company_id')->nullable($value = true);
            $table->integer('messageId');
            $table->integer('people_id')->nullable($value = true);
            $table->string('url')->nullable($value = true);
            $table->timestamps();

由于我在生产中使用当前迁移,我不想丢失数据。

我只是尝试使用我的新表定义修改迁移文件,但我得到:

> php artisan migrate
Nothing to migrate.

关于如何在 laravel 中正确更改迁移有什么建议吗?

感谢您的回复!

【问题讨论】:

如果 company 表被删除了,可以吗? ***.com/questions/16791613/… 这几乎有你需要的一切。 【参考方案1】:

要修改现有表,请创建新迁移。

php artisan make:migration alter_company_table

class AlterCompanyTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::table('company', function (Blueprint $table) 
            $table->integer('company_id')->nullable()->change();
            $table->integer('people_id')->nullable();
            $table->string('url')->nullable()->change();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::table('company', function (Blueprint $table) 
            $table->integer('company_id')->nullable(false)->change();
            $table->dropColumn('people_id');
            $table->string('url')->nullable(false)->change();
        );
    

【讨论】:

【参考方案2】:

如果您不介意丢失数据并且处于开发模式,您可以执行php artisan migrate:rollback 并在执行后:php artisan migrate。所以你的迁移工作正常。您可以阅读更多here。

现在,如果您只想添加新表并修改数据库中的其他表,则应该进行另一次迁移。但在此之前,您应该安装doctrine/dbal 才能正确修改您的表格,否则会给您带来很多错误。之后,将此行添加到您的 config/database.php

use Illuminate\Database\DBAL\TimestampType;

'dbal' => [
    'types' => [
        'timestamp' => TimestampType::class,
    ],
],

现在您可以:php artisan make:migration add_new_tables_to_company 和您在database/migrations 中的文件。

class AlterCompanyTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::table('company', function (Blueprint $table) 
            $table->integer('company_id')->nullable()->change();
            $table->integer('people_id')->nullable();
            $table->string('url')->nullable()->change();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::table('company', function (Blueprint $table) 
            $table->integer('company_id')->nullable(false)->change();
            $table->dropColumn('people_id');
            $table->string('url')->nullable(false)->change();
        );
    

【讨论】:

以上是关于Laravel 8 - 更改现有迁移的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel 将数据从表迁移到不同的表

Laravel迁移在现有数据库表中添加列问题

Laravel 迁移:从现有外键中删除 onDelete('cascade')

如何从 Laravel 中的现有数据库创建迁移和模型

Laravel 迁移:添加具有现有列默认值的列

Laravel 迁移显示现有列的列不存在