在您的应用程序开发过程中,我认为您不必太在意每次迁移只有一个表,有时在一次迁移中将一些表放在一起会更容易,但是一旦您的系统投入生产,您将无法继续这样工作,因为您只会在生产中迁移并且可能永远不会回滚,因此您的迁移将非常小,有时您将进行迁移以创建单个列。
将表放在不同的迁移中的优点与拥有一个瘦类相同,一个文件中的信息越少,就越容易管理和对其进行更改。因此,如果您将所有表放在一个迁移中,维护起来会变得更加困难,但这完全取决于您。
外键是一个很好的例子,说明为什么应该为每个表甚至每个外键创建一个迁移:每次回滚与外键相关的表时,都必须首先删除所有外部依赖项,这就是 Laravel 创建迁移它们的原因所有这些都以相同的顺序,它可以帮助您永远不会弄丢桌子。因此,首先创建表迁移,然后创建外键迁移,因此当您回滚时,它将首先回滚约束,然后是表。
我在该表的同一迁移中为该表创建外键,除非我有太多交叉外键。但我总是在单独的Schema::table() 命令中创建外键,因为某些数据库需要您在将约束附加到该列之前拥有该列:
public function up()
{
Schema::create('statuses', function(Blueprint $table)
{
$table->string('id', 64)->primary();
$table->string('user_id', 64)->index();
$table->text('body');
$table->timestamps();
});
Schema::table('statuses', function(Blueprint $table)
{
$table->foreign('user_id')
->references('id')
->on('users')
->onUpdate('cascade')
->onDelete('cascade');
});
}
关于多对多,如果你同时创建表和外键,你应该先创建主表,然后是数据透视表,但是如果你在单独的迁移中创建外键,首先创建表(顺序不会很重要,但在这些情况下最好组织起来),然后是外键的迁移。
在开发过程中,我对我的表进行了很多更改,所以我总是回到它们,所以当我更改迁移时,这就是我经常做的事情:
1) php artisan migrate:reset 多次
2) 改变迁移
3)php artisan migrate
如果我只是创建一个新的,通常不会有任何问题,因为迁移通常是幂等的。
您的最后一个问题已经得到解答,但我再说一遍:Laravel 使用时间戳命名迁移文件,这样您将永远不会在之前创建另一个迁移之前运行迁移:
2014_07_16_190821_create_statuses_table
还有迁移的名字很重要,因为上面这个会创建这个类:
CreateStatusesTable
所以你必须做的一件事是为每个迁移创建一个不同的名称,否则你最终会得到两个具有相同名称的类,而不是 Laravel,但 PHP 会抱怨它。