每次迁移Laravel多个表

jbx*_*jbx 18 php sql laravel

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

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

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

  2. 外键和关系怎么样?如何强制执行这些关系,以及执行迁移的顺序,如果table1引用table2中的列,table2是否在table1之前创建?

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

Ant*_*iro 32

在开发应用程序期间,我认为你不应该太在意每次迁移只有一个表,有时候只需要在一次迁移中让一些表更容易,但是一旦你的系统投入生产,你就不会能够继续这样工作,因为你只会在生产中迁移,而且可能永远不会回滚,所以你的迁移会非常小,有时你会为一个列的创建进行迁移.

将表放在不同的迁移中的优点与拥有一个瘦的类相同,一个文件中的信息越少,管理和更改就越容易.因此,如果您将所有表放在一次迁移中,则维护起来会变得更加困难,但这完全取决于您.

外键是为什么你应该为每个表创建一个迁移,甚至每个外键一个很好的例子:每次你回滚有关外键的表时,必须先删除所有外国的依赖,这就是为什么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');
    });
}
Run Code Online (Sandbox Code Playgroud)

关于多对多,如果你创建表和外键togheter,你应该首先创建主表,然后创建数据透视表,但如果你在单独的迁移中创建外键,首先创建表(顺序无关紧要,但在这些情况下组织起来也更好)然后迁移外键.

在开发过程中,我在表格中做了很多更改,所以我总是回到它们,所以当我改变迁移时,这就是我用来做的事情:

1)php artisan migrate:reset很多次

2)改变迁移

3) php artisan migrate

如果我只是创建一个新的,通常我不会有任何问题,因为迁移通常是idealotent.

您的上一个问题已经得到解答,但我会再次说明:Laravel使用时间戳命名迁移文件,这是您在之前创建的另一个迁移之前永远不会迁移的方式:

2014_07_16_190821_create_statuses_table
Run Code Online (Sandbox Code Playgroud)

迁移的名称,因为上面这个将创建这个类:

CreateStatusesTable
Run Code Online (Sandbox Code Playgroud)

所以你必须要做的一件事是用不同的名称创建每个迁移,否则你最终会得到两个具有相同名称的类,而不是Laravel,但PHP会抱怨它.

  • 非常感谢您的解释。它非常有帮助。是的,我完全理解应用程序投入生产后需要进行小的增量更改。我不确定大部分表格的初始基础创建是否能让我继续下去。但是,鉴于时间戳实际上强制迁移执行的顺序(我错过了),我想我不必担心由于不存在的表而无法创建关系。再次感谢! (2认同)