在Laravel迁移中使用新创建的列

时间:2017-06-21 04:55:22

标签: php mysql laravel

我有一个名为listings的表,其中包含一个名为closed的列,其数据类型为integer。该列仅包含两个值,1NULL

现在,我需要将此列的数据类型修改为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查询,但得到了同样的错误。

1 个答案:

答案 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');
        });
    }
}