在开发应用程序期间,我认为您不应该太在意每次迁移只有一个表,有时在单个迁移中拥有一些表会更容易,但是一旦您的系统进入生产环境,您将无法继续这样工作,因为您只会在生产环境中迁移,并且可能永远不会回滚, 因此,您的迁移将非常小,有时您将为单个列创建进行迁移。
将表放在不同的迁移中的好处与具有精简类的优点相同,一个文件中的信息越少,就越容易对其进行管理和更改。因此,如果您将所有表放在一次迁移中,则维护起来会变得更加困难,但这实际上取决于您。
外键就是一个很好的例子,说明为什么你应该为每个表甚至每个外键创建一个迁移:每次回滚与外键相关的表时,你必须首先删除所有外来依赖项,这就是为什么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会抱怨它。