在 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 中获取所有模型/迁移名称并添加单个新列