我是Laravel的新手,对这个框架的最佳实践有点新意。我试图了解使用migrations创建数据库的最佳方法。
我在网上找到的几个例子,包括Laravel文档here和here,似乎都指的是只处理一个表的迁移脚本。我正在创建一个包含大约10个表的应用程序,所有表都与它们之间的外键相互关联,其中一些表具有多对多的关系。
建议的方法是每个表有一个迁移文件吗?如果是这样的话? (将所有表创建脚本放在一个文件中有什么缺点,如果有的话?)
外键和关系怎么样?如何强制执行这些关系,以及执行迁移的顺序,如果table1引用table2中的列,则在table1之前创建table2?
多对多关系怎么样?是否需要通过单独的迁移脚本手动创建关系(数据透视)表?如果是,那么确保在2个相关表之后创建它?
答案 0 :(得分:29)
在开发应用程序期间,我认为你不应该太在意每次迁移只有一个表,有时候只需要在一次迁移中让一些表更容易,但是一旦你的系统投入生产,你就会将无法继续这样工作,因为您只会在生产中进行迁移,并且可能永远不会回滚,因此您的迁移将非常小,有时您将为单个列创建迁移。
将表放入不同的迁移中的优点与使用精简类相同,在一个文件中拥有的信息越少,就越容易管理和更改它。因此,如果您将所有表格放在一次迁移中,则维护起来会变得更加困难,但这完全取决于您。
外键是一个很好的例子,说明为什么你应该为每个表甚至每个外键创建一个迁移:每次回滚与外键相关的表时,必须先删除所有外部依赖项,这就是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
如果我只是创建一个新的,通常我不会有任何问题,因为迁移通常是意义上的。
你的上一个问题已经回答了,但我会再说一遍:Laravel使用时间戳命名迁移文件,这种方式永远不会在之前创建的另一个迁移之前运行:
2014_07_16_190821_create_statuses_table
迁移的名称,因为上面这个将创建这个类:
CreateStatusesTable
所以你必须做的一件事就是用不同的名称创建每个迁移,否则你最终会得到两个具有相同名称的类,而不是Laravel,但PHP会抱怨它。