Laravel 每次迁移多个表

Posted

技术标签:

【中文标题】Laravel 每次迁移多个表【英文标题】:Laravel multiple tables per migration 【发布时间】:2014-11-19 14:46:06 【问题描述】:

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

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

    推荐的方法是每个表有一个迁移文件吗?如果是,为什么? (如果有的话,把所有的建表脚本放在一个文件里有什么缺点?)

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

    多对多关系呢?是否也需要通过单独的迁移脚本手动创建关系(数据透视表)?如果是,是什么确保它是在 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 会抱怨它。

【讨论】:

非常感谢您的解释。它非常有帮助。是的,我完全理解应用程序投入生产后需要进行小的增量更改。我不确定大部分表格的初始基础创建是否能让我继续前进。但是,鉴于时间戳实际上强制了迁移执行的顺序(我错过了),我想我不必担心由于表不存在而无法创建关系。再次感谢! 最后是一些实用的 laravel 信息。他们的教程和文档非常棒,但它通常包含基本用例,而不是严肃编程所需的东西。 非常好的答案我认为是这种情况,但我很高兴你已经确认了它,这对于为什么是有道理的,但我可以理解为什么 OP 问这个问题,因为我想知道同样的问题。

以上是关于Laravel 每次迁移多个表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:使用名称中的变量创建表

3 表 Laravel 迁移需要建议

每个数据库使用一个 Laravel 迁移表

Laravel 数据迁移

Laravel migrate - 一次完成多个迁移(文件)

Laravel 5.0 - 在 1 个迁移中重命名多个列