Laravel 表 * 没有名为 * 的列

Posted

技术标签:

【中文标题】Laravel 表 * 没有名为 * 的列【英文标题】:Laravel table * has no column named * 【发布时间】:2017-06-29 04:01:42 【问题描述】:

我的单元测试最近开始失败。我收到此错误:

PDOException: SQLSTATE[HY000]: 
General error: 1 table loan_details has no column named start_month

发生的那一行,我有这段代码:

$loan = LoanDetails::create(['loan_percentage' => .8,
        'loan_product_id' => 1,
        'interest_rate' => .5,
        'start_month' => 0,
        'term' => 120,
        'fixed_finance_fee' => 0,
        'variable_finance_Fee' => 0,
        'valid_from' => '2015-01-01'
    ]);

如果我注释掉“start_month”行,那么它在逻辑上有效。

在我的单元测试设置中,我运行所有迁移(大约 80 个)。

我有一个如下所示的迁移:

Schema::table('loan_details', function(Blueprint $table)
     $table->integer('start_month')->unsigned()->after('interest_only')->default(0);
     $table->decimal('balloon_percent',4,3)->after('term')->nullable();
     $table->integer('balloon_month')->after('balloon_percent')->nullable();
     $table->dropColumn('ordinal_rank');
);

所以,我想知道是否所有迁移都没有运行,所以我运行了以下代码:

$rows = DB::table('migrations')->get();
print_r($rows);

这会列出所有已完成的迁移。我正在使用内存中的 sqlite db 进行测试。

我想知道迁移是否是异步运行的,并且在我的代码运行时它们还没有全部完成?或者如果迁移在某处默默地失败了?

我已经在这里呆了好几个小时了,不知道发生了什么。

*UPDATE 我有一个在上述迁移之后运行的迁移,并且我确认后续迁移是成功的。所以只是这一次迁移在某种程度上默默地失败了。

【问题讨论】:

您是否看到在迁移运行列表中添加列的迁移? 是的,我列出了所有这些,包括我期望的。 您看到数据库中的那一列了吗?如果迁移运行时出现错误,即使未完成,它也可能保存在迁移表中。 我认为它不在数据库中。我不知道如何检查内存中的sqlite db。 如果这是最后一次迁移,您可以尝试使用“php artisan migrate:rollback”回滚,然后运行“php artisan migrate”再次执行 【参考方案1】:

我发现了问题。这是因为 sqlite 存在一个荒谬的限制,即在一个表调用中没有多个添加列语句,如 here 所示。

当我按如下方式分离迁移时:

Schema::table('loan_details', function(Blueprint $table)
    $table->integer('start_month')->unsigned()->after('interest_only')->default(0);
);
Schema::table('loan_details', function(Blueprint $table)
    $table->decimal('balloon_percent',4,3)->after('term')->nullable();
);
Schema::table('loan_details', function(Blueprint $table)
    $table->integer('balloon_month')->after('balloon_percent')->nullable();
);
Schema::table('loan_details', function(Blueprint $table)
    $table->dropColumn('ordinal_rank');
);

【讨论】:

感谢您的回答。这帮助很大。不能使用 $table->morphs('taggable'); 非常令人失望。因为这会创建列和索引,这在使用 sqlite 进行单元测试时会出现问题。 谢谢。这对我很有帮助。 我可以进行测试以检查架构是否正确,但这似乎很荒谬。 $this->assertTrue(Schema::hasColumn('users', 'firstName'), 'Users 表没有 firstName 列。'); $this->assertTrue(Schema::hasColumn('users', 'lastName'), 'Users 表没有lastName 列。');我可以通过测试来查看 sqlite 模式。 dd(DB::select("SELECT name, sql FROM sqlite_master WHERE type='table' ORDER BY name;"));【参考方案2】:

检查 SQLite DB 记录here

还有许多其他有用的内置点命令——参见文档 http://www.sqlite.org/sqlite.html,sqlite3 的特殊命令部分。

另外,检查数据库架构

【讨论】:

以上是关于Laravel 表 * 没有名为 * 的列的主要内容,如果未能解决你的问题,请参考以下文章

您可以从一个表中的列中调用数据以在 SQL 和 Laravel 中的另一个表中使用吗?

表信息在编译插入时没有名为 Desc 的列

如何在现有表中添加额外的列而不丢失数据

django 表没有名为 Exception 的列

sqlite3.OperationalError:表测试没有名为 python 的列错误

如何从其他表中获取所需的列