Laravel 迁移,在 hasColumn 方法上失败

Posted

技术标签:

【中文标题】Laravel 迁移,在 hasColumn 方法上失败【英文标题】:Laravel migration, fails on hasColumn method 【发布时间】:2019-01-27 00:46:28 【问题描述】:

我使用的是 laravel 5.2 版本和 php 7.1。我正在尝试从我的 laravel 项目中迁移文件,我有代码来检查列的存在,如下所示 -

if (!Schema::hasColumn('table1', 'column1')) 
    // Add column1

我知道代码非常好,并且在设置相同的代码时已经运行了好几次。但现在我在单独的机器上尝试这个并且失败并出现错误 -

[ErrorException] 未定义的属性: stdClass::$column_name

如果我从代码中删除 hasColumn 检查,我可以摆脱这个错误,但这是我在整个代码中编写的内容,不能仅仅为了运行迁移而修改每个迁移。

非常感谢您对此的任何帮助。

堆栈跟踪:

[ErrorException] 未定义属性:stdClass::$column_name

异常跟踪:() 在 /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/mysqlProcessor.php:18 照亮\Foundation\Bootstrap\HandleExceptions->handleError() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php:18 Illuminate\Database\Query\Processors\MySqlProcessor->Illuminate\Database\Query\Processorsclosure() 在 n/a:n/a array_map() 在 /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php:21 Illuminate\Database\Query\Processors\MySqlProcessor->processColumnListing() 在 /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php:40 Illuminate\Database\Schema\MySqlBuilder->getColumnListing() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php:69 Illuminate\Database\Schema\Builder->hasColumn() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:217 Illuminate\Support\Facades\Facade::__callStatic() at /private/var/www/html/whitelabel_eb/database/migrations/2017_07_28_053158_add_columns_to_project_configurations_table.php:16 AddColumnsToProjectConfigurationsTable->closure() 在 /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php:69 Illuminate\Database\Schema\Blueprint->__construct() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php:207 Illuminate\Database\Schema\Builder->createBlueprint() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php:116 Illuminate\Database\Schema\Builder->table() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:217 Illuminate\Support\Facades\Facade::__callStatic() at /private/var/www/html/whitelabel_eb/database/migrations/2017_07_28_053158_add_columns_to_project_configurations_table.php:103 AddColumnsToProjectConfigurationsTable->up() 在 /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:135 Illuminate\Database\Migrations\Migrator->runUp() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:112 Illuminate\Database\Migrations\Migrator->runMigrationList() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:85 Illuminate\Database\Migrations\Migrator->run() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:74 Illuminate\Database\Console\Migrations\MigrateCommand->fire() at 不适用:不适用 call_user_func_array() 在 /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Container/Container.php:507 照亮\容器\容器->调用()在 /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Console/Command.php:150 Illuminate\Console\Command->execute() at /private/var/www/html/whitelabel_eb/vendor/symfony/console/Command/Command.php:238 Symfony\Component\Console\Command\Command->run() at /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Console/Command.php:136 Illuminate\Console\Command->run() at /private/var/www/html/whitelabel_eb/vendor/symfony/console/Application.php:840 Symfony\Component\Console\Application->doRunCommand() 在 /private/var/www/html/whitelabel_eb/vendor/symfony/console/Application.php:190 Symfony\Component\Console\Application->doRun() 在 /private/var/www/html/whitelabel_eb/vendor/symfony/console/Application.php:114 Symfony\Component\Console\Application->run() 在 /private/var/www/html/whitelabel_eb/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:107 Illuminate\Foundation\Console\Kernel->handle() at /private/var/www/html/whitelabel_eb/artisan:35

【问题讨论】:

你能发布完整的堆栈跟踪而不是直接的错误吗? https://github.com/the-control-group/voyager/issues/1528 的帖子中也发生了同样的事情。但是他们使用 voyager 作为php artisan voyager:install --with-dummy @JohnEllmore 没有堆栈跟踪,只有上面显示的错误。 不幸的是,上面的错误消息并没有太多可取之处。您是否通过 artisan 命令行工具运行这些迁移?如果是这样,我认为添加 -vvv 应该包含一个完整的堆栈跟踪,其中包含任何错误。那就是php artisan migrate -vvv 嗨@JohnEllmore,我在下面的答案中添加了堆栈跟踪。 【参考方案1】:

我进行了以下更改来解决此问题。 转到以下路径:/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php

改变这个, return $r->column_name; 行号 18 到 return $r->COLUMN_NAME;

【讨论】:

【参考方案2】:

看问题,大概https://github.com/laravel/framework/pull/21037这个解决了,不过这个改动是针对Laravel 5.5的。 Laravel 5.2 不再受支持,因此您可以在需要时尝试使用自己的 fork 进行此修复 - 您可以为此使用 Composer VCS 功能。

当然,升级到最新版本可能是个好主意(很多问题在以后的版本中得到了解决),但假设您的应用很复杂并且没有经过适当的测试,这可能会有风险。

【讨论】:

@DIGVJSS 但正如我所说,你可以 fork repo 并在你的 fork 中添加一些更改并使用 VCS 来修复这个问题,而无需将你的项目更新到更高的 Laravel 版本

以上是关于Laravel 迁移,在 hasColumn 方法上失败的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 迁移中更改列类型的最佳方法是啥?

Laravel - 迁移,表结构修改 - 正确方法

laravel 迁移文件中修改含有enum字段的表报错解决方法

Laravel 数据迁移

laravel数据迁移

laravel中的数据迁移和数据填充