将列添加到现有表

时间:2015-07-24 16:35:07

标签: php laravel laravel-5

我有一个名为projects_table的迁移

Schema::create('projects', function(Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->integer('user_id');
});

我需要添加一个名为project_settings的新列。我以为我可以添加

$table->text('project_settings');

并运行php artisan migrate,但我错了,没有用。然后我读了http://laravel.com/docs/5.0/schema#adding-columns并了解到我必须使用Schema::table(...);所以我将现有的迁移(projects_table)更改为:

Schema::table('projects', function(Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->text('project_settings');
    $table->integer('user_id');
});

但仍然没有奏效。我终于通过创建新的迁移ProjectsTableNewField并简单地添加

来实现它
Schema::table('projects', function(Blueprint $table) {
    $table->text('project_settings');
});

我的问题是,这是在laravel中做到这一点的正确方法吗?添加列是一项非常基本的任务。如果我必须为每个数据库更改创建一个迁移,我认为迁移文件夹将会很快。这样做的正确方法是什么?

编辑:我还发现,为了迁移目的,有created_atupdated_at字段非常重要。我也会添加这些字段

4 个答案:

答案 0 :(得分:2)

这是正常行为,但通常只有在您的应用程序已投入生产时才进行此类迁移,或者您的测试网站数据很重要并且您不想丢失它。

当您进行开发并且您拥有的数据并不重要时,您可以更改迁移,就像您在此处所做的那样:

Schema::table('projects', function(Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->text('project_settings');
    $table->integer('user_id');
});

然后只需重新运行进行刷新的迁移:

php artisan migrate:refresh

这将重置所有迁移并再次运行。

此外,如果您使用播种机,您只需一个命令就可以运行所有迁移并为数据库设定种子:

php artisan migrate:refresh --seed

答案 1 :(得分:1)

是的,当您想要更新表的结构时创建新的迁移是正确的。

它允许你推动"在不影响现有数据库的情况下对实时服务器进行此修改。

他们的另一种方式,但如果你已经在表中存储了数据,它可能不适用:

  1. 使用php artisan migrate:reset
  2. 回滚迁移
  3. 更新现有迁移文件并在字段列表中添加新字段
  4. 再次运行迁移:php artisan migrate
  5. 请记住,这将删除所有现有表格,最终导致数据丢失,以防您已存储数据。

答案 2 :(得分:1)

您应该拥有一个类似于以下内容的数据库迁移文件:

public function up()
{
    Schema::create('table_name', function(Blueprint $table)
    {
        $table->increments('id');
        //custom fields here
        $table->timestamps();
    });
}

public function down()
{
    Schema::drop('table_name');
}

首先运行以下命令创建表:

php artisan migrate

更改所需的自定义字段后,请运行以下命令:

php artisan migrate:refresh

这将按照每次迁移的顺序运行down函数,然后使用自定义字段重新创建它们。这使您无需管理大量的迁移文件。但是,出于显而易见的原因,您永远不想在生产服务器上使用它。

在深入了解php编程之前仔细考虑一下你的数据建模,从组织的角度来看,你会感谢自己从长远来看,这样你就不必一遍又一遍地重做数据库。

请记住,如果您想要使用样本数据,则需要使用播种机。每次执行此操作时都会擦除表格。如果您正在创建一个新表并且没有修改以前的表,那么您可以只运行第一个命令。

要使用其他命令,请使用php artisan命令查看可用的内容。

答案 3 :(得分:1)

非常简单,您可以向现有表添加新列

  1. 使用您喜欢的任何名称进行新的迁移:
  2. php artisan make:migration new_column_in_my_table --table=your_desired_table_to_modify

    并在您的命令末尾仔细编写要修改的同一个表的名称,如:

    --table=your_desired_table_to_modify 
    

    然后完全命令:

    php artisan make:migration new_column_in_my_table  table=your_desired_table_to_modify
    
    1. 然后新创建的迁移" new_column_in_my_table"将在你的情况下像:

      Schema::table('projects', function(Blueprint $table)    {
      $table->text('project_settings')->after('name');
      });
      
    2. 保存更改并运行命令

      php artisan migrate