在 laravel 的迁移中是不是有必要为每个 up() 写下来()?

Posted

技术标签:

【中文标题】在 laravel 的迁移中是不是有必要为每个 up() 写下来()?【英文标题】:Is it necessary to write down() for every up() in migration in laravel?在 laravel 的迁移中是否有必要为每个 up() 写下来()? 【发布时间】:2015-04-28 14:34:56 【问题描述】:
class UpdateSessions extends Migration 

    public function up()
    
            Schema::table('sessions', function($table)
                $table->string('comCode')->nullable()->change();
            );
    

    public function down()
    
         // What should i write here?
    


我已经创建了一个会话表来编写迁移以将列更改为可为空。 现在我很困惑我应该写什么?

【问题讨论】:

【参考方案1】:

截至 2015 年 12 月,至少在 Laravel 5 中你可以编写

Schema::table('sessions', function($table)
    $table->string('comCode')->change();
);

注意:这次没有nullable()

【讨论】:

【参考方案2】:

在迁移的down 方法中,您可以撤消在up 方法中所做的更改。当您使用 artisan migrate:rollback 命令回滚迁移时,将调用此方法。在您的情况下,它看起来像这样:

public function down()

    // Laravel doesn't have a method to undo ->nullable()
    // so you have to do use a raw query in this case
    DB::statement('ALTER TABLE sessions MODIFY comCode VARCHAR(255) NOT NULL');

因此,如果您在迁移 up 中将名为 comCode 的列修改为可为空,则在回滚迁移时,您需要更新该列定义以使其不为空,这就是您在down 方法。

down 方法中不需要任何内容​​才能使迁移成功运行,但是一旦运行迁移,您将无法回滚它,除非您在 @987654330 中有正确的代码@方法。

【讨论】:

使用 DB:statement 还原更改是一种好习惯吗?我心中有便携性。此语句可能适用于 mysql 但不适用于所有 dbms? @alishaukat 不,这不是一个好习惯,应尽可能避免。但是在这种情况下,这是必要的,因为没有可用的方法来抽象此更改所需的查询。大多数 DBMS 需要对列进行完整定义才能对其进行更改,并且由于 Schema Builder 忽略了以前迁移中设置的列定义,因此在应用更改时需要再次指定它们(这可能会产生很多影响,因为您可能还需要重新定义键和约束)。 关于这个特定的专栏更新问题here进行了长时间的讨论,但似乎没有解决方案。 如果 db 中有空数据会怎样?他在迁移后使用空值插入数据。并且您尝试在 down 方法中删除 nullable .. 它崩溃了。

以上是关于在 laravel 的迁移中是不是有必要为每个 up() 写下来()?的主要内容,如果未能解决你的问题,请参考以下文章

是否有必要在 laravel 中为数据库操作创建模型(用于查询构建器)?

如何在 laravel 中获取所有模型/迁移名称并添加单个新列

Laravel:+100 表...是不是使用迁移?

使用迁移 Laravel 5.4 更新列

Laravel Artisan Migrate 命令创建表但不将每个迁移文件填充到迁移表

是否可以使用 Laravel 5 对动态数据库连接进行迁移?