【问题标题】:Using a newly created column in Laravel migration在 Laravel 迁移中使用新创建的列
【发布时间】:2017-06-25 19:34:26
【问题描述】:

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

现在,我需要将此列的数据类型修改为timestamp,但根据documentation,这对于timestamp 数据类型是不可能的。我还想将此列的值设置为当前日期,其中以前的值为 1NULL,如果以前包含 NULL

这是我的策略:

  • 创建一个名为 closed_temp 的新列,使其具有当前日期的默认值
  • closed_temp 设置为NULL,只要closedNULL
  • 删除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 查询,但得到了同样的错误。

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    我通过创建两个单独的迁移文件解决了这个问题,为此migration order 很重要,因为创建新列closed_temp 的迁移文件必须在包含用于更新@987654323 的逻辑的迁移文件之前运行@ 列,然后将其重命名为 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');
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 2019-02-13
      • 1970-01-01
      • 2017-08-29
      • 2015-11-24
      • 2015-12-25
      • 2018-05-12
      • 2021-01-30
      • 2016-07-04
      相关资源
      最近更新 更多