【问题标题】:Laravel 在迁移中向现有表添加新列
【发布时间】:2013-05-23 09:33:54
【问题描述】:

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

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

<?php

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

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

如何添加新列?

【问题讨论】:

  • 如果您可以包含您遇到的任何错误,那将会很有用;你预计会发生什么;实际发生了什么?
  • 好问题。那里有很多迁移文档,它向您展示了 API 以及如何在第一次创建表。然后,随着您更多地开发应用程序并需要修改数据库结构,这一切都失败了。

标签: php laravel laravel-migrations


【解决方案1】:

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

对于 Laravel 5+:

php artisan make:migration add_paid_to_users_table --table=users

对于 Laravel 3:

php artisan migrate:make add_paid_to_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 4 / Laravel 5 的文档中都有很好的介绍:

对于 Laravel 3:

编辑:

使用$table-&gt;integer('paid')-&gt;after('whichever_column');将该字段添加到特定列之后。

【讨论】:

  • php artisan migrate
  • 出了点问题。我制作“db:make”来制作一个新的迁移文件。然后我把 Schema::table('users', function($table) { $table->integer('paid'); });进去。并运行“php artisan migrate”,但出现致命错误:Cannot redeclare class Users in /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php 在第 3 行
  • 文档中还介绍了创建迁移。你应该给它一个更具体的名字,比如“add_paid_to_users”,这样它就不会和你的模型冲突了。
  • 似乎任何 Laravel 3 文档 URL 都重定向到 Laravel 4 文档。这是schema buildermigrations的3个文档的链接
  • 从 Laravel 5 开始,这个命令现在是 php artisan make:migration add_paid_to_users
【解决方案2】:

我会为未来使用 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"] 选项,这将为您的迁移添加更多样板。小点,但在做大量的时候很有帮助!

【讨论】:

  • 在 Laravel 5.0 中并非如此,Blueprint 是在 Laravel 5.1 中添加的。只需澄清一点。
  • @PhillSparks 你是对的,谢谢你发现我的错误。我已经更新以阐明可以使用的版本。
【解决方案3】:

laravel 5.6 及以上版本

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

通过执行以下命令创建一个新的迁移:ma​​ke:migration

示例:

php artisan make:migration add_store_id_to_users_table --table=users

在数据库/迁移文件夹中,您有新的迁移文件,例如:

2018_08_08_093431_add_store_id_to_users_table.php(见 cmets)

<?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

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

【讨论】:

  • 非常全面和相关的答案。谢谢!
  • 回滚不会像这样工作。要回滚工作,$table-&gt;dropForeign('posts_store_id_foreign'); $table-&gt;dropColumn('store_id');
【解决方案4】:

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

php artisan make:migration add_paid_to_users

所有用于制作事物的命令(控制器、模型、迁移等)都已移至make: 命令下。

php artisan migrate 还是一样的。

【讨论】:

    【解决方案5】:

    您可以像这样在初始 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();
    });
    

    文档对此相当详尽,从 version 3version 4 并没有太大变化。

    【讨论】:

    • 出了点问题。我制作“db:make”来制作一个新的迁移文件。然后我把 Schema::table('users', function($table) { $table->integer('paid'); });进去。并运行“php artisan migrate”,但出现致命错误:Cannot redeclare class Users in /Applications/XAMPP/xamppfiles/htdocs/adsense/application/migrations/2013_05_28_122527_users.php 在第 3 行
    • 在创建迁移时,您应该为每个迁移命名。通常,我将初始创建命名为 create_users_table,然后如果我要添加列:add_email_password_columns_to_users
    • 是的,正如进化所说,当然最好坚持原始的 laravel 设计理念,并且只在每个文件前面使用“add_”动词来跟踪更改。这样更容易跟踪版本控制等的更改,因为每次迭代都会创建一个新的添加文件。如果您只是继续修改“create_”,则很难知道 x 员工通过删除索引或添加新列等搞砸了一些事情。至少在我看来这是有道理的! :)
    【解决方案6】:

    在 Laravel 8 中

    php artisan make:migration add_columnname_to_tablename_table --table=tablename
    

    然后在创建迁移之后

    public function up()
        {
            Schema::table('users', function (Blueprint $table) {
    
                // 1. Create new column
                $table->datatype('column_name')->nullable();
            });
        }
    public function down()
        {
            Schema::table('users', function (Blueprint $table) {
    
                // 1. Create new column
                $table->dropColumn('column_name');
            });
        }
    

    然后运行

    php artisan migrate
    

    如果遇到错误,请使用创建表之前的日期重命名迁移名称,然后再次运行 php artisan migrate

    【讨论】:

    • 我们可以为新的 col 创建播种机吗?
    【解决方案7】:

    Laravel 7

    1. 使用 cli 命令创建迁移文件:

      php artisan make:migration add_paid_to_users_table --table=users

    2. 将在 migrations 文件夹中创建一个文件,在编辑器中打开它。

    3. 添加到函数up():

    Schema::table('users', function (Blueprint $table) {
        // Create new column
        // You probably want to make the new column nullable
        $table->integer('paid')->nullable()->after('status');
    }
    
    1. 添加到函数down(),这将在迁移失败的情况下运行:

      $table-&gt;dropColumn('paid');

    2. 使用 cli 命令运行迁移:

      php artisan migrate


    如果您想在表中添加列以创建外键约束:

    在上述过程的第 3 步中,您将使用以下代码:

    $table->bigInteger('address_id')->unsigned()->nullable()->after('tel_number');
    
    $table->foreign('address_id')->references('id')->on('addresses')->onDelete('SET NULL');
    

    在上述过程的第 4 步中,您将使用以下代码:

    // 1. Drop foreign key constraints
    $table->dropForeign(['address_id']);
    // 2. Drop the column
    $table->dropColumn('address_id');
    

    【讨论】:

    • 我对 Laravel 很陌生。它应该让事情变得更容易,我可以看到。但是,如果我想在表中添加一列,为什么要执行上述所有操作?为什么我不直接通过 phpmyadmin 或 mysql CLI 将其添加到 sql 表中?我又是新人。如果我正确解释这些答案,似乎会创建很多一次性代码。
    • @MichaelB 好吧,Laravel 建议使用 Migrations 向当前表添加新表或字段或创建关系。为什么?因为在从“开发环境”转移到“生产环境”(实时网站)时,您不必自己在数据库中创建所有这些表和关系。您只需要将文件上传到服务器,更新 .env 文件并运行迁移命令。 Laravel 将为您创建包含关系的表。
    【解决方案8】:

    这个东西在 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
    

    希望对您有所帮助。

    【讨论】:

      【解决方案9】:

      首先回滚您之前的迁移

      php artisan migrate:rollback
      

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

      php artisan migrate
      

      【讨论】:

      • 它对我不起作用。收到消息“Nothing to migrate”
      【解决方案10】:

      警告这是一种破坏性行为。如果您使用它,请确保您首先备份您的数据库

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

      $ php artisan migrate:refresh
      

      【讨论】:

      • 刷新会清空表
      • 这是非常危险的——如果有些人运行旧版本,有些人会运行新版本,然后就会出现混乱。在 Liquibase 中,如果你编辑一个文件,除非你明确地设置例外来允许它,否则它会失败,而且你只能在极少数情况下这样做。例如。如果在某些数据库中已经有空数据的情况下使列不为空,它将中断。
      • 如果你编辑你的答案并提到它会清空你的桌子,那就更好了。
      • 注意:此命令会清理整个数据库表,如果你想使用它,请先备份你的数据库
      【解决方案11】:

      将列添加到您的迁移文件并运行此命令。

      php artisan migrate:refresh --path=/database/migrations/your_file_name.php
      

      【讨论】:

        【解决方案12】:

        虽然迁移文件是其他人提到的最佳做法,但在紧要关头,您也可以使用 tinker 添加一列。

        $ 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'); 
        });
        

        【讨论】:

          【解决方案13】:

          首先你必须创建一个迁移,你可以在 laravel artisan CLI 上使用 migrate:make 命令。旧的 laravel 版本,比如 laravel 4,你可以使用这个命令 对于 Laravel 4:

          php artisan migrate:make add_paid_to_users
          

          对于 laravel 5 版本

          对于 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');
          
              });
          
          }
          

          您可以进一步检查this

          【讨论】:

            【解决方案14】:

            如果您不想将蓝图(架构)拆分为两个迁移文件,那么您可以做的最好的事情是从数据库中删除表,然后重命名迁移文件的最后一个数字并执行

            php artisan migrate
            

            这有助于保护其他表的数据。

            【讨论】:

              【解决方案15】:

              运行以下命令: php工匠迁移:新鲜--seed 它将删除表并重新添加它以更新添加到数据库中的所有列

              【讨论】:

              • 在生产环境中,您不希望仅仅为了添加新列而刷新表。
              【解决方案16】:

              你可以做的是喜欢,

              Schema::create('users', function ($table) { $table-&gt;integer("paid"); });

              写完这个写命令php artisan migratephp artisan refresh 我个人更喜欢刷新而不是全新迁移,因为如果您进行全新迁移,它将删除所有数据,刷新不会。

              但唯一的例外是如果您刷新并且表中有任何外键,因此它不会重新建立关系,因此您会收到类似的错误,

              无法添加外键约束

              【讨论】:

              • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
              猜你喜欢
              • 2021-05-13
              • 2021-11-11
              • 2011-06-17
              • 2019-12-08
              • 2014-12-26
              • 2021-09-11
              • 2015-09-02
              • 2017-10-18
              • 2018-02-06
              相关资源
              最近更新 更多