【问题标题】:How php artisan migrate command uses Connection.php file?php artisan migrate 命令如何使用 Connection.php 文件?
【发布时间】:2020-11-11 00:33:20
【问题描述】:

我正在尝试使用我的 Laravel 项目构建来修复错误,并想了解 php artisan migrate 命令究竟执行了哪些步骤。

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

  1. 我在包中创建了一个迁移,它向现有表添加了一个新列:
    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. 然后我把标签放到我的项目composer.json文件中的包版本中
'package: dev-master#tag-number'

并运行 composer update package 来更新 .lock 文件。

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

3.2。但是在远程阶段服务器上构建分支会出现以下错误。

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 文件要查找此列? 是否已开始从包迁移但尚未完成?或者还会发生什么?

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

Image of the error message

【问题讨论】:

  • 我看到人们对我的问题投了反对票。也许我的解释不够好,所以我添加了更多细节。
  • 您是否尝试过检查迁移是否真的在部署到远程服务器时运行?给定的查询,针对特定 ID 运行 SELECT,通常不应在执行迁移时运行
  • 几分钟前我在下面发布并回答我找到了原因 - 我在存储库构造函数的 SELECT 查询中使用了此列。而且我不知道并且仍然不知道为什么migrate 命令在运行迁移之前在构造函数中运行代码。所以我无法执行任何 php artisan 命令,甚至 cache:clear 因为存储库中的查询(使用了 prettus/l5-repository 库)
  • 好吧,您可以调试您的应用程序以检查为什么在运行任何迁移之前触发该查询。也许您需要将您的服务定义为惰性服务?也许您需要检查为什么服务的构造函数已经使用数据库?
  • 我同意你的观点,调试它并找出原因会非常好,但是如果我运行 php artisan migrate 命令,我找不到应该放置断点的位置。你会如何调试它?

标签: php laravel database-migration dbal


【解决方案1】:

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

public function down()

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

    {

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

        {

            $table->dropColumn('is_good_product');

        });

    }
}

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

【讨论】:

  • 感谢您的快速回复!但是为什么要尝试删除 php artisan migrate 命令上的列?我认为应该先调用 up() 函数。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2017-09-27
    • 2016-09-07
    • 2018-07-28
    • 2019-10-29
    • 2019-01-12
    • 2017-10-10
    • 2020-10-23
    • 2017-05-31
    相关资源
    最近更新 更多