php artisan migrate 命令如何使用 Connection.php 文件?

How php artisan migrate command uses Connection.php file?

我正在尝试修复我的 Laravel 项目构建中的错误,并且想了解 php artisan migrate 命令究竟完成了哪些步骤。

该项目使用我的自定义包。

  1. 我在包中创建了一个迁移,它向现有的 table:
  2. 添加了一个新列
    public function up()
    {
        Schema::table('products', function (Blueprint $table) {
            $table->boolean('is_good_product')->default(0);
        });
    }

    public function down()
    {
        Schema::table('products', function (Blueprint $table) {
            $table->dropColumn('is_good_product');
        });
    }
  1. 然后我把tag放到我的项目composer.json文件
  2. 中的包版本
'package: dev-master#tag-number'

和运行作曲家更新包更新.lock文件。

3.1。如果我在本地 运行 'php artisan migrate' 命令,我会看到新迁移 运行s 并创建所需的列。

3.2。但是在远程阶段服务器上构建 b运行ch 会出现以下错误。

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'is_good_product' in 'where clause' (SQL: select `name` from `products` where `is_good_product` = 1)  

我在尝试迁移、回滚、刷新、更新数据库时看到此错误运行。只有手动创建列可以帮助我进行回滚然后迁移。

为什么 Connection.php 文件正在查找此列? 是否已开始从包迁移但尚未完成?或者还会发生什么?

[编辑] 换句话说 - 为什么 'artisan migrate' 命令抱怨新添加的迁移文件的未知列? (如果应该 运行 它并添加该列)。如果未迁移 运行(因为未创建列),Connection.php 文件如何知道该列?

Image of the error message

快速解决您的问题的方法是:

public function down()

{    
   if (Schema::hasColumn('products', 'is_good_product'))

    {

        Schema::table('products', function (Blueprint $table)

        {

            $table->dropColumn('is_good_product');

        });

    }
}

您收到 Connection.php 错误的原因是它没有找到要删除它的列。

经过深入研究,我找到了迁移命令不起作用的原因。问题出在我的存储库的一个构造函数中,它调用了一个使用该列的函数。在 运行 迁移之前,我不知道 Laravel 以某种方式 运行 存储库中的源代码。我仍然想找出迁移命令完成的步骤。