向迁移中的现有表添加新列


270

我不知道如何使用Laravel框架向现有数据库表添加新列。

我尝试使用...来编辑迁移文件。

<?php

public function up()
{
    Schema::create('users', function ($table) {
        $table->integer("paid");
    });
}

在终端中,我执行php artisan migrate:installmigrate

如何添加新列?


如果可以包含任何错误,这将很有用;您期望发生什么?实际发生了什么?
Phill Sparks

9
好问题。那里有很多迁移文档,它向您展示了API以及如何首次创建表。然后,随着您进一步开发应用程序并需要修改数据库结构,一切都会失败。
Andrew Koper

Answers:


609

要创建迁移,您可以在Artisan CLI上使用migration:make命令。使用特定名称以避免与现有模型冲突

对于Laravel 3:

php artisan migrate:make add_paid_to_users

对于Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

然后,您需要使用该Schema::table()方法(在访问现有表而不是创建新表时)。您可以添加如下所示的列:

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

并且不要忘记添加回滚选项:

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

然后,您可以运行迁移:

php artisan migrate

Laravel 3的文档都对此进行了详细介绍:

对于Laravel 4 / Laravel 5:

编辑:

用于$table->integer('paid')->after('whichever_column');在特定列之后添加此字段。


3
Justphp artisan migrate
Phill Sparks

出了点问题。我制作“ db:make”以制作一个新的迁移文件。然后我把Schema :: table('users',function($ table){$ table-> integer('paid');}); 进去。并运行“PHP的工匠迁移”,但得到致命错误:不能重新声明类用户在/Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php第3行
基姆·拉森

文档中还介绍了创建迁移。您应该给它一个更特定的名称,例如“ add_paid_to_users”,这样它就不会与模型冲突发生冲突。
Phill Sparks

似乎任何Laravel 3文档URL都重定向到Laravel 4文档。这是指向3个用于架构构建器迁移的

6
从Laravel 5开始,该命令现在为php artisan make:migration add_paid_to_users
mikelovelyuk

64

我将为使用Laravel 5.1及更高版本的未来读者添加mike3875的答案。

为了使事情更快,您可以使用标志“ --table”,如下所示:

php artisan make:migration add_paid_to_users --table="users"

这将自动添加updown方法的内容:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        //
    });
}

同样,您可以--create["table_name"]在创建新迁移时使用该选项,这将为迁移添加更多样板。一点点,但在加载它们时很有帮助!


2
Blueprint在Laravel 5.1中添加了Laravel 5.0中的情况。仅需澄清一点。
Phill Sparks '02

@PhillSparks您说得对,谢谢您发现我的错误。我已经更新以阐明可以使用它的版本。
camelCase

24

如果您使用的是Laravel 5,则命令为:

php artisan make:migration add_paid_to_users

用于制作事物的所有命令(控制器,模型,移植等)均已移至该make:命令下。

php artisan migrate 仍然一样。


24

laravel 5.6及更高版本

如果您想将新列作为FOREIGN KEY添加到现有表中。

通过执行以下命令来创建新的迁移:make:migration

范例:

php artisan make:migration add_store_id_to_users_table --table=users

在database / migrations文件夹中,您有新的迁移文件,例如:

2018_08_08_093431_add_store_id_to_users_table.php(请参阅评论)

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddStoreIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Create new column
            // You probably want to make the new column nullable
            $table->integer('store_id')->unsigned()->nullable()->after('password');

            // 2. Create foreign key constraints
            $table->foreign('store_id')->references('id')->on('stores')->onDelete('SET NULL');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

            // 1. Drop foreign key constraints
            $table->dropForeign(['store_id']);

            // 2. Drop the column
            $table->dropColumn('store_id');
        });
    }
}

之后运行命令:

php artisan migrate

如果出于任何原因要撤消上一次迁移,请运行以下命令:

php artisan migrate:rollback

您可以在文档中找到有关迁移的更多信息


1
非常全面且相关的答案。谢谢!
musicin3d

17

您可以在初始Schema::create方法中添加新列,如下所示:

Schema::create('users', function($table) {
    $table->integer("paied");
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

如果已经创建了表,则可以通过创建新的迁移并使用Schema::table方法来向该表添加其他列:

Schema::table('users', function($table) {
    $table->string("title");
    $table->text("description");
    $table->timestamps();
});

文档对此非常详尽,并且从版本3版本4的更改没有太多。


出了点问题。我制作“ db:make”以制作一个新的迁移文件。然后我把Schema :: table('users',function($ table){$ table-> integer('paid');}); 进去。并运行“PHP的工匠迁移”,但得到致命错误:不能重新声明类用户在/Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php第3行
基姆·拉森

创建迁移时,应为每个迁移命名一个唯一的名称。通常,我会先命名初始创建create_users_table,然后添加列:add_email_password_columns_to_users
tplaner

是的,正如Evolution所说,一定要坚持原始的laravel设计理念,最好只add_在每个文件的开头使用动词来跟踪更改。这样,由于每次迭代都会创建一个新的添加文件,因此更容易跟踪版本控制等的更改。如果您只是继续修改“ create_”,那么很难知道x员工,通过删除索引或添加新列等弄乱了某些东西,至少在我看来这很有意义!:)
03:02有线

7

您可以简单地修改现有的迁移文件,例如在表中添加一列,然后在终端中键入:

$ php artisan migrate:refresh

11
刷新将清空表格
JohnTaa

8
这是非常危险的-如果某些人使用旧版本,则有些人将使用新版本,并且随之而来的是混乱。在Liquibase中,如果编辑文件,它将失败,除非您明确允许例外,并且只有在极少数情况下才能这样做。例如,如果在某些数据库中已经包含空数据的情况下使列不为空,则它将中断。
约翰·利特尔(Little Little)

3
最好是,如果您编辑答案并提到它将清空您的表,那会更好。
亚伯(Abel)

注意:此命令将清除整个数据库表,如果要使用它,则先备份数据库
Udhav Sarvaiya

5

这个东西在laravel 5.1上工作。

首先,在您的终端上执行此代码

php artisan make:migration add_paid_to_users --table=users

之后,转到您的项目目录并展开目录数据库-迁移并编辑文件add_paid_to_users.php,添加此代码

public function up()
{
    Schema::table('users', function (Blueprint $table) {
         $table->string('paid'); //just add this line
    });
}

之后,返回您的终端并执行此命令

php artisan migrate

希望对您有所帮助。


5

首先回滚您以前的迁移

php artisan migrate:rollback

之后,您可以修改现有的迁移文件(添加新的,重命名或删除列),然后重新运行迁移文件

php artisan migrate

0

尽管迁移文件是最佳实践,就像其他人提到的那样,但在紧要关头,您也可以添加带有修补程序的列。

$ php artisan tinker

这是终端的单线示例:

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ $table->integer('paid'); })



(此处将其格式化为便于阅读)

Schema::table('users', function(\Illuminate\Database\Schema\Blueprint $table){ 
    $table->integer('paid'); 
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.