Laravel 每次迁移多个表
Posted
技术标签:
【中文标题】Laravel 每次迁移多个表【英文标题】:Laravel multiple tables per migration 【发布时间】:2014-11-19 14:46:06 【问题描述】:我是 Laravel 的新手,所以对这个框架的最佳实践有点陌生。我正在尝试了解使用 migrations 创建数据库的最佳方法。
我在网上找到的几个例子,包括 Laravel 文档 here 和 here,似乎是指只处理一个表的迁移脚本。我正在创建一个包含大约 10 个表的应用程序,所有表都与它们之间的外键相关联,其中一些具有多对多关系。
推荐的方法是每个表有一个迁移文件吗?如果是,为什么? (如果有的话,把所有的建表脚本放在一个文件里有什么缺点?)
外键和关系呢?如何强制执行这些关系以及执行迁移的顺序,以便如果 table1 引用 table2 中的列,则 table2 在 table1 之前创建?
多对多关系呢?是否也需要通过单独的迁移脚本手动创建关系(数据透视表)?如果是,是什么确保它是在 2 个相关表之后创建的?
【问题讨论】:
【参考方案1】:在您的应用程序开发过程中,我认为您不必太在意每次迁移只有一个表,有时在一次迁移中将一些表放在一起会更容易,但是一旦您的系统投入生产,您将无法继续这样工作,因为您只会在生产中迁移并且可能永远不会回滚,因此您的迁移将非常小,有时您将进行迁移以创建单个列。
将表放在不同的迁移中的优点与拥有一个瘦类相同,一个文件中的信息越少,就越容易管理和对其进行更改。因此,如果您将所有表放在一个迁移中,维护起来会变得更加困难,但这完全取决于您。
外键是一个很好的例子,说明为什么应该为每个表甚至每个外键创建一个迁移:每次回滚与外键相关的表时,都必须首先删除所有外部依赖项,这就是 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');
);
关于多对多,如果你同时创建表和外键,你应该先创建主表,然后是数据透视表,但是如果你在单独的迁移中创建外键,首先创建表(顺序不会很重要,但在这些情况下最好组织起来),然后是外键的迁移。
在开发过程中,我对我的表进行了很多更改,所以我总是回到它们,所以当我更改迁移时,这就是我经常做的事情:
1) php artisan migrate:reset
多次
2) 改变迁移
3)php artisan migrate
如果我只是创建一个新的,通常不会有任何问题,因为迁移通常是幂等的。
您的最后一个问题已经得到解答,但我再说一遍:Laravel 使用时间戳命名迁移文件,这样您将永远不会在之前创建另一个迁移之前运行迁移:
2014_07_16_190821_create_statuses_table
还有迁移的名字很重要,因为上面这个会创建这个类:
CreateStatusesTable
所以你必须做的一件事是为每个迁移创建一个不同的名称,否则你最终会得到两个具有相同名称的类,而不是 Laravel,但 PHP 会抱怨它。
【讨论】:
非常感谢您的解释。它非常有帮助。是的,我完全理解应用程序投入生产后需要进行小的增量更改。我不确定大部分表格的初始基础创建是否能让我继续前进。但是,鉴于时间戳实际上强制了迁移执行的顺序(我错过了),我想我不必担心由于表不存在而无法创建关系。再次感谢! 最后是一些实用的 laravel 信息。他们的教程和文档非常棒,但它通常包含基本用例,而不是严肃编程所需的东西。 非常好的答案我认为是这种情况,但我很高兴你已经确认了它,这对于为什么是有道理的,但我可以理解为什么 OP 问这个问题,因为我想知道同样的问题。以上是关于Laravel 每次迁移多个表的主要内容,如果未能解决你的问题,请参考以下文章