【问题标题】:Make column not nullable in a Laravel migration在 Laravel 迁移中使列不可为空
【发布时间】:2012-12-10 10:22:31
【问题描述】:

我现在正在编写迁移以在表nullable 中创建某些列。对于向下功能,我当然想再次制作那些列not nullable。我查看了schema builder docs,但看不到这样做的方法。

任何帮助将不胜感激。

【问题讨论】:

标签: php sql database-migration laravel


【解决方案1】:

在 Laravel 5 之前,没有 Laravel 原生方法可以使用模式构建器更改现有表列。您需要为此使用原始查询。

但是,从 Laravel 5 开始,您可以使用:

$table->string('foo')->nullable(false)->change();

在运行上述命令之前,您必须具有 dbal 依赖项:

composer require doctrine/dbal

【讨论】:

  • 这也是我发现的。对于架构构建器来说,一个不错的选择是允许更改它似乎不支持的列定义。我敢肯定还有很多像我一样的人正在使用模式构建器来修改现有数据库,而不仅仅是从头开始创建表。
  • Taylor Otwell(Laravel 的创建者)在 6 天前(2014-05-09)说:“我仍然坚持我的声明,如果有人能够成功且干净地做到这一点,我会合并它。” github.com/laravel/framework/issues/895#issuecomment-42709756
  • @Musa 显然你可以设置一个可以为空的列(例如:$table->string('colmn', 255)->nullable()->change();)但是反过来似乎不起作用($table->string('colmn', 255)->change();),所以你仍然需要为此使用原始数据库查询
  • 见下面@MattMcDonald 的回答。您可以使用 nullable() 使其可空,使用 nullable(false) 使其在迁移中不可为空。
  • nullable(false) 在 Laravel 5.3 中对我不起作用 :(
【解决方案2】:

从 Laravel 5 开始,可以通过将 false 作为参数传递给 nullable 来扭转这种情况。

$table->string('foo')->nullable(false)->change();

【讨论】:

  • 有效!因此,由于 Laravel 的更新,这已成为正确答案。
  • 谢谢,虽然我不明白为什么默认情况下不能将列设置为不可为空。这通常是最佳实践,但这会给代码增加很多噪音。
  • 列默认为非空。发帖人只是在询问如何反转已经为空的列。
  • 必须先composer require doctrine/dbal
【解决方案3】:

首先运行这个:

composer require doctrine/dbal

然后创建一个像这样改变表的迁移:

php artisan make:migration fix_whatever_table_name_here

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->nullable(false)->change();
    });
}

# Optional:
# public function down()
# {
#     Schema::table('table_name', function ($table) {
#         $table->type('column')->nullable()->change();
#     });
# }

【讨论】:

  • 是否有理由在回滚例程中删除整个列? down() 方法应该只是撤消 up() 方法的逻辑以支持向后和向前滚动迁移。
【解决方案4】:

您可以在没有 ->nullable() 的情况下再次声明该列并使用 ->change

public function up()
{
    Schema::table('table_name', function (Blueprint $table) {
        $table->type('column')->change();
    });
}

public function down()
{
    Schema::table('table_name', function ($table) {
        $table->type('column')->nullable()->change();
    });
}

【讨论】:

    【解决方案5】:

    在 laravel 8 中,你只需要这样写: “->可空()”

    $table->string('name')->nullable(); 
    

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 2014-08-16
      • 2021-03-20
      • 2019-05-29
      • 2020-11-11
      • 2023-03-19
      • 2011-08-23
      • 2013-09-10
      • 2014-04-13
      相关资源
      最近更新 更多