我有一个名为listings
的表,其中包含一个名为closed
的列,其数据类型为integer
。该列仅包含两个值,1
或NULL
。
现在,我需要将此列的数据类型修改为timestamp
,但根据documentation,这对于timestamp
数据类型是不可能的。我还想将此列的值设置为前一个值为1
的当前日期和前一个包含NULL
的{{1}}。
以下是我的策略:
NULL
的新列,其默认值为当前日期closed_temp
设置为closed_temp
NULL
closed
NULL
列closed
列重命名为closed_temp
这是我的代码:
closed
但是,这给了我一些错误:
[照亮\数据库\ QueryException]
SQLSTATE [42S22]:未找到列:1054未知列' closed_temp' 在'字段列表' (SQL:更新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(); } } }); }
设置listings
= 2017-06-21 04:50:5 8,updated_at
=closed_temp
= 3)[学说\ DBAL \驱动\ PDOException]
SQLSTATE [42S22]:未找到列:1054未知列' closed_temp' 在'字段列表'[PDOException]
SQLSTATE [42S22]:未找到列:1054未知列' closed_temp' 在'字段列表'
有没有办法在迁移中使用新创建的列?如果没有,还有其他选择吗?我也试过运行listing_id
查询,但得到了同样的错误。
答案 0 :(得分:-1)
我通过创建两个单独的迁移文件来修复此问题,因此migration order很重要,因为创建新列closed_temp
的迁移文件必须在包含逻辑的迁移文件之前运行更新closed_temp
列,然后将其重命名为closed
。
下面复制了两个迁移文件:
class AlterListingsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('listings', function (Blueprint $table) {
$table->timestamp('closed_temp')->default(\Carbon\Carbon::now())->nullable();
});
}
}
class AlterListingsClosedFieldTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('listings', function (Blueprint $table) {
$listings = Listing::all();
foreach ($listings as $key => $listing) {
if(!isset($listing->closed)) {
$listing->closed_temp = NULL;
$listing->save();
}
}
$table->dropColumn('closed');
$table->renameColumn('closed_temp', 'closed');
});
}
}