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 中的另一个表中使用吗?