我是Laravel的新手,对这个框架的最佳实践有点新意.我试图了解使用迁移创建数据库的最佳方法.
我在网上找到的几个例子,包括这里和这里的Laravel文档,似乎都是指只处理一个表的迁移脚本.我正在创建一个包含大约10个表的应用程序,所有表都与它们之间的外键相互关联,其中一些表具有多对多关系.
建议的方法是每个表有一个迁移文件吗?如果是这样的话?(将所有表创建脚本放在一个文件中有什么缺点,如果有的话?)
外键和关系怎么样?如何强制执行这些关系,以及执行迁移的顺序,如果table1引用table2中的列,table2是否在table1之前创建?
那么多对多关系怎么样?是否需要通过单独的迁移脚本手动创建关系(数据透视)表?如果是,那么确保在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会抱怨它.
| 归档时间: |
|
| 查看次数: |
11563 次 |
| 最近记录: |