【发布时间】:2017-06-25 19:34:26
【问题描述】:
我有一个名为listings 的表,它当前包含一个名为closed 的列,其数据类型为integer。该列仅包含两个值,1 或 NULL。
现在,我需要将此列的数据类型修改为timestamp,但根据documentation,这对于timestamp 数据类型是不可能的。我还想将此列的值设置为当前日期,其中以前的值为 1 和 NULL,如果以前包含 NULL。
这是我的策略:
- 创建一个名为
closed_temp的新列,使其具有当前日期的默认值 - 将
closed_temp设置为NULL,只要closed是NULL - 删除
closed列 - 将
closed_temp列重命名为closed
这是我的代码:
public function up()
{
Schema::table('listings', function (Blueprint $table) {
$table->timestamp('closed_temp')->default(\Carbon\Carbon::now())->nullable();
$listings = Listing::all();
foreach ($listings as $listing) {
if(!isset($listing->closed)) {
$listing->closed_temp = NULL;
$listing->save();
}
}
});
}
但是,这给了我一些错误:
[照亮\数据库\查询异常]
SQLSTATE [42S22]:找不到列:1054 未知列 'closed_temp' 在“字段列表”中(SQL:更新listings设置updated_at= 2017-06-21 04:50:5 8,closed_temp= 其中listing_id= 3)[Doctrine\DBAL\Driver\PDOException]
SQLSTATE [42S22]:找不到列:1054 未知列 'closed_temp' 在“字段列表”中[PDO异常]
SQLSTATE [42S22]:找不到列:1054 未知列 'closed_temp' 在“字段列表”中
有没有办法在迁移中使用新创建的列?如果没有,还有什么其他选择?我也尝试运行raw_sql 查询,但得到了同样的错误。
【问题讨论】: