Laravel每迁移多个表
我是Laravel的新手,所以这个框架的最佳实践有点新。我正在尝试了解使用migrations创建数据库的最佳方法。Laravel每迁移多个表
我在网上找到的几个例子,包括Laravel文档here和here,似乎是指仅处理一个表的迁移脚本。我创建了一个包含大约10个表的应用程序,它们之间都与外键相关,有些表与多对多的关系有关。
推荐的方法是每个表有一个迁移文件?如果是这样,为什(将所有表创建脚本放在一个文件中有什么缺点(如果有的话)?
外键和关系怎么样?如何执行这些关系以及执行迁移的顺序,以便如果table1引用table2中的列,则table2会在table1之前创建?
多对多的关系呢?关系(透视)表是否需要通过单独的迁移脚本手动创建?如果是,确保它是在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会投诉它。
非常感谢您的解释。它非常有帮助。是的,我完全理解一旦应用程序在生产中需要进行小的增量更改。我不确定大部分表格的最初基础创建是如何让我走的。但是,考虑到时间戳实际上强制执行迁移的顺序(我错过了),我想我不应该担心由于不存在的表而不会创建关系。再次感谢! – jbx 2014-09-25 00:29:05
终于有一些很好的实用laravel信息。他们的教程和文档是真实的,但它通常包含基本用例,而不是严格编程所需的东西。 – Srneczek 2015-06-03 12:32:43
非常好的答案我认为这是事实,但我很高兴你已经证实了它,它为什么有意义,但我可以看到为什么OP问这个问题,因为我想知道同样的问题。 – rosscooper 2016-04-12 23:12:40