【问题标题】:Laravel: Add column to table with updated migrationLaravel:使用更新的迁移将列添加到表中
【发布时间】:2020-02-17 19:23:52
【问题描述】:

我正在尝试迁移一个迁移文件中的特定行。

示例:

之前:

Schema::create('categories', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->string('category_name');
  $table->integer('parent_id')->nullable();
  $table->timestamps();
});

之后:

Schema::create('categories', function (Blueprint $table) {
  $table->bigIncrements('id');
  $table->string('category_name');
  $table->string('img_url'); // ← new column
  $table->integer('parent_id')->nullable();
  $table->timestamps();
});

现在我只想迁移线路:$table->string('img_url');

有可能吗?

【问题讨论】:

  • 这样不行。如果要向现有表添加列,请创建新迁移并使用 Schema::table() 而不是 Schema::create(),然后再次运行 php artisan migrate

标签: php laravel migration schema


【解决方案1】:

听起来您正在尝试向已通过迁移创建的表添加列。如果是这种情况,您需要使用Schema::table(...),而不是使用Schema::create(...)

通常,您会为此创建一个新的迁移:

$ php artisan make:migration add_img_url_to_categories

这将在/database/migrations 创建一个名为2019_10_21_165554_add_img_url_to_categories.php 的新文件。然后将此代码添加到up() 函数中:

public function up()
{
  Schema::table('categories', function (Blueprint $table) {
    $table->string('img_url');
  });
}

您的另一个选择是完全按照您所做的那样编辑迁移(根据您问题中的代码),然后运行:

$ php artisan migrate:fresh // drop all tables and re-run all migrations

$ php artisan migrate:refresh // reset and re-run all migrations

但请记住,这些都是破坏性操作——这意味着您将丢失数据库中已有的所有数据。在早期开发中,这可能无关紧要。但您应该真正养成为数据库更改创建迁移的习惯,而不是编辑现有迁移。

迁移的目的是让您(或使用您的应用的任何人)可以快速部署与您的应用所期望的架构相匹配的数据库。 在开发过程中,在调整数据库架构以适应您正在开发的功能时,编辑迁移并不少见。

但是,一旦您部署或发布了应用,您应该考虑将所有迁移都锁定或只读。从那时起的任何数据库更改都应在迁移中完成。

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2015-09-22
    • 2017-10-18
    • 2021-05-13
    • 2013-05-23
    • 2019-03-19
    • 2017-12-02
    • 2017-08-29
    • 2016-09-25
    相关资源
    最近更新 更多