【问题标题】:remove Default in migration?在迁移中删除默认值?
【发布时间】:2016-11-16 00:44:08
【问题描述】:

在迁移中,我将 enabled 字段更改为默认设置为 1 值。

public function up()
{
    Schema::table('client', function (Blueprint $table) {
        $table->boolean('enabled')->default(1)->change();
    });
}

down() 方法中 - 如何删除 default() ?我知道可以做到default(0),但在创建表期间从未创建默认值。

【问题讨论】:

  • 如果没有任何反应,请尝试考虑在您的 down() 方法中编写原始查询。
  • 试试$table->boolean('enabled')->change();

标签: laravel laravel-5.2


【解决方案1】:

由于无法使用 Laravel 函数删除此语句,因此您的 down 函数必须以原始方式执行该语句。它应该是这样的:

public function down()
  {
    Schema::table('client', function ($table) {
      DB::statement('ALTER TABLE' . $table . 'ALTER COLUMN enabled DROP DEFAULT');
    });
  }

为了执行此迁移,您需要在迁移顶部包含:

use Illuminate\Support\Facades\DB;

【讨论】:

  • 由于类名本身已经是“DB”,没有“DB”别名就足够了。
【解决方案2】:

无论是否令人惊讶,对于NOT NULL 字段->default(null) 从表中删除默认值:

public function up()
{
    Schema::table('client', function (Blueprint $table) {
        $table->boolean('enabled')->default(null)->change();
    });
}

仅仅省略default() 部分是行不通的,因为laravelcurrent statecurrent state + specified changes 之间产生了一个diff。未指定更改,没有差异。

之后,doctrine 生成ALTER TABLE statement,将NULL 视为no default value

虽然可以为空字段,但据我所知,doctrine 不允许您简单地删除默认值。唯一的选择应该是让他们NOT NULL

public function up()
{
    Schema::table('client', function (Blueprint $table) {
        $table->boolean('enabled')->nullable(false)->default(null)->change();
    });
}

也许使用 PostgreSQL 你可以摆脱without converting to NOT NULL,但这有待确认。

【讨论】:

  • 附注:Laravel 迁移不支持更改某些列类型。我只是尝试更改 tinyInteger 列,但没有成功。详情请见laravel.com/docs/5.4/migrations#modifying-columns
  • 如果->default(null)NULL 设置为默认值并且->noDefault() 将删除默认值会更直观(我考虑过->default(false),但它应该将false 设置为默认值Postgres...)。
  • @Wirone 只是为了澄清一下,如果您希望列的默认值是实际的空值,您只需使列可以为空,并且它将始终默认为空。 Laravel 中不需要额外的 DB 方法;只需将 ->nullable() 添加到您的列定义中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2017-10-19
  • 2016-10-06
  • 2019-12-31
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多