在Laravel迁移中向现有表添加新列

时间:2019-04-11 09:33:57

标签: php mysql laravel migration laravel-5.5

我想在laravel的现有表users中添加一些新列。

我已经对此进行了搜索,并在进行这些搜索之后,已经使用命令php artisan make:migration add_columns_to_users创建了迁移。

add_columns_to_users.php

public function up()
{
    Schema::table('users', function($table) {
        $table->string('address');
        $table->string('city');
        $table->string('tribe');
        $table->string('country');
        $table->integer('student_id');
        $table->string('tribe_university_name');
        $table->string('student_program_of_study');
        $table->string('faculty');
        $table->string('level');
    });
}

public function down()
{
    Schema::table('users', function($table) {
        $table->dropColumn('address');
        $table->dropColumn('city');
        $table->dropColumn('tribe');
        $table->dropColumn('country');
        $table->dropColumn('student_id');
        $table->dropColumn('tribe_university_name');
        $table->dropColumn('faculty');
        $table->dropColumn('level');
    });
}

创建后,我运行此命令php artisan migrate

但是有同样的错误:

  

基本表或视图已存在:1050表'用户'已存在(SQL:创建表usersid int unsigned not null auto_increment主键,name varchar(255)不为空,email varchar(255)不为空,password varchar(255)不为空,remember_token varchar(100)为空,created_at时间戳为空,{{1} } timestamp null)默认字符集utf8整理utf8_unicode_ci)

用户表updated_at的全名,另一个名称为2014_10_12_000000_create_users_table.php

如何解决这个问题?

我的主要查询是如何在现有表中添加新列?

6 个答案:

答案 0 :(得分:1)

修改当前迁移无效,因为它在migration表中的条目已经存在。因此,要在现有表中进行任何更改,您需要创建新的迁移脚本。

// remember `create` replaced by `table` here  

Schema::table('users', function (Blueprint $table) { 
    // add whichever new columns you want to
});

执行以下步骤,

  1. php artisan make:migrate modify_user_table
  2. modify_user_table目录中打开database/migrations文件
  3. 在我写的顶部添加新列。

  4. 现在在将新列添加到新的迁移文件中之后保存文件

  5. cmd-> php artisan migrate

编辑

  1. 如果没有用户数据,则打开2014_10_12_000000_create_users_table.php文件,并在Schema::dropIfExists('users');行之前添加Schema::create('users'...

  2. 如果有数据,则可以进行备份,然后再次执行上述步骤1。

答案 1 :(得分:0)

请执行步骤1。 PHP的工匠迁移:重置 第2步:使用PHPmyadmin(或类似工具)进入数据库并删除所有剩余的表 -包括迁移表。

毕竟请执行步骤3的php artisan迁移

答案 2 :(得分:0)

如果检查错误跟踪:

  

基本表或视图已存在:1050表“用户”已存在

这意味着用户表已经存在,因此在您进行迁移时,它试图创建一个已经在数据库中创建的表。

注意:不要忘记先备份数据库

从数据库

删除用户表还会从迁移表中删除用户条目。

之后,执行migration Artisan命令:php artisan migrate


现在您的另一个问题是:如何在现有表中添加新列?

您必须使用以下命令创建表:

php artisan make:migration create_users_table

您得到的输出是这样的:创建的迁移:2019_04_12_070152_create_users_table

您的迁移结构是这样的:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

现在您要在现有用户表中添加新列

php artisan make:migration add_phone_number_to_users_table --table=users

使用Schema::table()方法(因为您正在访问现有表,而不是创建新表)。您可以添加这样的列:

public function up()
{
     Schema::table('users', function (Blueprint $table) {
         $table->string('phonenumber')->after('name'); // use this for field after specific column.
     });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('phonenumber');
    });
}

之后,您可以运行迁移:php artisan migrate

您的新列(phonenumber)现在已添加到现有的用户表中,您可以在数据库中查看该表。

如果仍有疑问,请参阅此video

答案 3 :(得分:0)

问题来自php artisan migrate,当2014_10_12_000000_create_users_table.php已经迁移时,它将尝试迁移两个文件,因此IMO在这里有两种可能的解决方案:

  1. 从数据库回滚users表,然后重新运行迁移cmd。
  2. migrations表中添加迁移名称,以使cmd不会尝试第二次运行它。

答案 4 :(得分:0)

您需要在工匠命令中进行少量修改

artisan make:migration add_columns_to_users_table

然后您需要使用  Schema :: table()方法(当您访问现有表时,不创建新表)。您可以添加这样的列

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

添加回滚选项:

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

然后您可以运行迁移:

 php artisan migrate

答案 5 :(得分:0)

您可能会收到此错误,因为您尝试创建另一个Users表,该表已经存在于数据库中。这可能就是您发现错误Base table or view already exists: 1050 Table 'users' already exists的原因。

因此,解决方案是尝试更改现有的Users表,而不是运行另一种语法来创建和覆盖Users表。通过在数据迁移文件夹中创建另一个alter class。它曾经位于Laravel项目(modules)上的../database/migrations/文件夹中。

  • 找到目录后,创建新的alter类。例如,alter_users_table.php
  • 因此,如果您想在age表上添加另一列(例如:int列,类型为Users,可以为空),则可以在{{ 1}}:

alter_users_table.php
  • 之后,尝试在您的终端上运行class AlterUsersAddAge extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('Users', function (Blueprint $table) { $table->int('age')->nullable(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('Users', function (Blueprint $table) { $table->dropColumn('age'); }); } }
  • 现在您应该在php artisan migrate表上看到另一个新列age