Laravel每迁移多个表

问题描述:

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

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

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

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

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

在你的应用程序的开发,我不认为你应该太在意其每迁移只有一张桌子,有时它只是更容易有一些表togheter在一个单一的迁移,但只要你的系统中去到生产,你将无法继续这样工作,因为你只能在生产环境中迁移,而且可能永远不会回滚,所以你的迁移将会非常小,有时你会为单个列的创建进行迁移。

将表格放在不同迁移中的优点与具有薄类别相同,您在一个文件中拥有的信息越少,管理和更改就越容易。因此,如果您将所有表格都放在一个迁移中,则维护起来会更困难,但这真的取决于您。

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

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

在开发过程中我做了很多在我的表的变化,所以我总是回来给他们,所以这是我用来做什么,当我改变迁移:

1)php artisan migrate:reset多次

2)改变迁移

3)php artisan migrate

如果我只是创造一个新的,平时我不会有任何问题,因为移民通常是idepotent。

你的最后一个问题已经回答了,但我再说一遍:Laravel名称使用时间戳的迁移文件中,这样你就永远不会有一个迁移之前,另一个之前创建正在运行:

2014_07_16_190821_create_statuses_table 

和迁移问题的名字,因为这一块上面将创建这个类:

CreateStatusesTable 

这么一件事你必须做的是创造一个不同的名称每迁移,否则你将最终有两个班,同名,而不是Laravel,但PHP会投诉它。

+0

非常感谢您的解释。它非常有帮助。是的,我完全理解一旦应用程序在生产中需要进行小的增量更改。我不确定大部分表格的最初基础创建是如何让我走的。但是,考虑到时间戳实际上强制执行迁移的顺序(我错过了),我想我不应该担心由于不存在的表而不会创建关系。再次感谢! – jbx 2014-09-25 00:29:05

+0

终于有一些很好的实用laravel信息。他们的教程和文档是真实的,但它通常包含基本用例,而不是严格编程所需的东西。 – Srneczek 2015-06-03 12:32:43

+0

非常好的答案我认为这是事实,但我很高兴你已经证实了它,它为什么有意义,但我可以看到为什么OP问这个问题,因为我想知道同样的问题。 – rosscooper 2016-04-12 23:12:40