每次迁移Laravel多个表


Laravel multiple tables per migration

我是Laravel的新手,所以对这个框架的最佳实践有点陌生。我正在努力了解使用迁移创建数据库的最佳方法。

我在网上找到的几个例子,包括这里和这里的Laravel文档,似乎指的是只处理一个表的迁移脚本。我正在创建一个大约有10个表的应用程序,这些表之间都有外键,有些表有多对多的关系。

  1. 建议的方法是每个表有一个迁移文件吗?如果是,为什么?(将所有表创建脚本放在一个文件中(如果有的话)有什么缺点?)

  2. 外键和关系呢?如何强制执行这些关系,以及执行迁移的顺序,以便如果表1引用表2中的列,则表2在表1之前创建?

  3. 那么多对多关系呢?关系(透视)表是否也需要通过单独的迁移脚本手动创建?如果是,是什么确保它是在2个相关表之后创建的?

在开发应用程序的过程中,我认为您不应该太在意每次迁移只有一个表,有时在一次迁移中切换一些表会更容易,但一旦您的系统投入生产,您将无法继续这样工作,因为您只会在生产中迁移,而且可能永远不会回滚,因此,您的迁移将非常小,有时您需要为单个列的创建进行迁移。

将表放在不同迁移中的好处与拥有一个精简类相同,一个文件中的信息越少,管理和更改就越容易。因此,如果将所有表放在一个迁移中,维护起来会变得更加困难,但这实际上取决于您。

外键是一个很好的例子,说明了为什么你应该为每个表甚至每个外键创建一个迁移:每次回滚与外键相关的表时,你必须首先删除所有的外部依赖项,这就是为什么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会抱怨它