【问题标题】:Adding a column to existing table向现有表添加列
【发布时间】:2015-07-24 16:35:06
【问题描述】:

我运行了一个名为 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 字段用于迁移目的很重要。我也会添加这些字段

【问题讨论】:

  • 这个网站已经在制作中了吗?
  • 不,不是。我目前正在使用 wamp。

标签: php laravel laravel-5


【解决方案1】:

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

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

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

【讨论】:

  • 最后一条命令是重新运行我的播种机的有用快捷方式,谢谢
【解决方案2】:

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

它允许您在实时服务器上“推送”这些修改,而不会破坏现有数据库。

他们是另一种方式,但如果您已经将数据存储在表中,则可能不适用:

  1. 使用php artisan migrate:reset 回滚迁移
  2. 更新现有迁移文件并在字段列表中添加新字段
  3. 再次运行迁移:php artisan migrate

请记住,这将删除所有现有表,如果您已经存储了一些数据,最终会丢失数据。

【讨论】:

  • 好的,谢谢。很高兴知道破坏生产网站的可能性。幸运的是,我仍在开发中,刚刚开始。目前我所有的数据都是通过播种机输入的,所以如果我删除现有数据就可以了
【解决方案3】:

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

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 命令查看可用的内容。

【讨论】:

  • 我昨天刚刚了解了播种机,它们对测试数据非常有用。我创建了播种器文件,因此丢失早期开发的所有数据并不是什么大问题。我一定会在一开始就考虑我的结构。
【解决方案4】:

您可以非常简单地将新列添加到现有表中

  1. 使用您喜欢的任何名称进行新的迁移:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2014-06-21
    • 2014-12-12
    • 2023-04-04
    • 1970-01-01
    • 2012-07-04
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多