每次迁移多个表

2022-08-30 14:51:28

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

我在 Web 上找到的几个示例(包括此处此处的 Laravel 文档)似乎是指仅处理一个表的迁移脚本。我正在创建一个包含大约 10 个表的应用程序,这些表都与它们之间的外键相互关联,其中一些表具有多对多关系。

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

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

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


答案 1

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

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

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


答案 2

推荐