回答

收藏

Laravel每次迁移都有多个表

技术问答 技术问答 514 人阅读 | 0 人回复 | 2023-09-14

我是Laravel新手,所以对这个框架的最佳做法有些陌生。我试图了解使用迁移创建数据库的最佳方法。
7 W7 k6 Q  B+ r  `8 p" y! ^我在网上找到的几个例子,包括这里和这里Laravel文档似乎是指只处理一个手表的迁移脚本。我正在创建一个大约有10个手表的应用程序,所有手表都与它们的外键相关,有些手表有多对多的关系。
& X% R5 k+ _3 U) f3 T6 L[ol]建议的方法是每个表都有迁移文件吗?如果可以的话,为什么?(在文件中放置所有表创建脚本(如果有)有什么缺点?- D9 \0 D" P: o. `5 g, L+ J5 p5 h, b
外键和关系呢?如何执行这些关系和迁移顺序?table1引用table二中一列,则table2在table1之前创建?
$ e7 ~/ ?. @' O  `- h; q那么多对多关系呢?关系(数据透视)表也需要通过单独的迁移脚本手动创建吗?如果是,如何确保在两个相关表之后创建?7 l/ ~0 v4 ~2 F  Q* L4 G
[/ol]                                                               
( M2 g) u2 _; n; H+ h& c; y    解决方案:                                                                ' [- C3 W4 a& B. }. x3 N$ Q1 e! Q
                                                                在应用程序的开发过程中,我认为你不必太在意每次迁移只有一张表,有时在一次迁移中有一些表togheter会更容易,但一旦你的系统投入生产,你就不会保持这种状态,因为你只会在生产环境中移动,而且可能永远不会滚动,所以你的移动量会很小,有时你需要移动单列。! ^1 C1 ~& S" w
将表放入不同迁移的优点与薄类相同。文件中的信息越少,管理和更改就越容易。因此,如果所有的表都放在一个迁移中,它将很难维护,但这实际上取决于你。' f5 Y7 J, _" ?; i( h- ~! K% B; N
外键是一个很好的例子,它解释了为什么每个表甚至每个外键都应该创建一个迁移:每次回滚与外键相关的表时,必须首先删除所有外部依赖项,这就是为什么Laravel在表中创建所有迁移的原因。同样的顺序可以帮助你永远不会失去桌子的下落。因此,首先创建表迁移,然后创建外部键迁移,所以在回滚之前,先回滚约束。
1 A3 z+ ~- _2 X, E% U除非表中有太多的交叉外键,否则我会在表的同一迁移中为表创建外键。但我总是一个人Schema::table()在命令中创建外键,因为一些数据库要求您在将约束附加到列之前拥有列:
* M5 a5 {, a0 F1 _/ `5 Spublic 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);大约有很多。如果您创建表和外键切换器,您应该首先创建主表,然后创建数据透视表。然而,如果您想在单独的迁移中创建外键,您应该首先创建表(顺序无关紧要,但最好在这种情况下组织),然后迁移外键。
  [! g4 z. h+ \' ?. ?在开发过程中,我在手表上做了很多改变,所以我总是回到手表上。因此,当我改变迁移时,这就是我想做的:' v7 C$ m8 A5 h2 O. o2 M& Y
1)php artisan migrate:reset很多次/ b& N  D3 d4 R" I- d4 W# }7 n0 b
2)变更迁移  M7 C7 o+ ]* K" V5 s( M4 V$ ]
3) php artisan migrate
7 _( Y5 m' t- @0 q' E4 [! U假如我只创建一个新的数据库,通常不会有任何问题,因为迁移通常是权力等等。9 o: q0 m& k4 H; h$ U5 W6 H
你的最后一个问题已经回答了,但我会再说一遍aravel使用时间戳命名迁移文件,这是你在迁移前永远不会创建另一种迁移方式:
; T" \# U9 A% u! q/ b2014_07_16_190821_create_statuses_table以及迁移问题的名称,因为上述步骤将创建此类:) `# P7 {7 _) O1 A: C
CreateStatusesTable因此,你必须做的一件事就是用不同的名字创建每个迁移,否则你最终会得到两个名字相同的类别,而不是Laravel,但是PHP会抱怨它。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则