如何通过laravel迁移和种子

时间:2016-03-17 17:15:33

标签: database laravel database-migration laravel-seeding

我有我的迁移文件,它为数据库创建初始模式,并且我有种子文件,它填充初始模式,随机数据和集合类型。

我对迁移和种子的理解是,无论何时新的团队成员加入,他都可以运行它们并快速完成所有数据库更改和产品的需求数据,以及您可以应用更改通过运行迁移文件来stg和prod。

但是,随着我的项目的进步,新的数据类型已经出现,应用它们的唯一方法是创建一个将插入数据库的迁移。

我遇到的问题是,工匠与迁移和种子一起工作的方式是它首先运行所有迁移,然后,它运行所有种子,似乎没有办法让我指定顺序他们应该在哪里运行。因此,如果我运行 migrate:refresh --seed ,我会遇到错误,因为它会应用最新的迁移,这些迁移会插入新数据(可能会也可能不依赖于种子中插入的类型)种子插入了他自己的数据。

我们尝试的一个解决方案是更新种子,并在应用插入数据的迁移更改之前进行检查,但这对维护来说非常麻烦。

此方案的迁移和种子的预期用途是什么?

更新 试图让它更清晰: 假设我有一个迁移来创建用户: 用户:{id,name,type} 我有我的种子来创建用户。

我同时运行两个,并且我有一组用户表。

时间流逝,我们决定需要一个user_types表。 创建迁移,创建新表,并填充新用户类型和更新的数据,以使当前user.type与user.type_id匹配。

Devs运行迁移,他们的db都是最新的。

一个新的开发团队加入了团队。他负责迁移。然后是种子。 它破了。

现在,如果我们更新种子以匹配最新种子,我们将遇到user_types表的重复数据。为了避免这种情况,我们需要在迁移过程中使用某种防御性代码,以便在没有数据的情况下不运行,并且如果有数据则进行更新。

问题是,这是使用迁移的正确方法吗?如何在不必重新运行种子的情况下将数据更改推送给所有开发人员?

2 个答案:

答案 0 :(得分:2)

我认为迁移不应该依赖种子中的任何数据。种子应该期待最新的迁移模式。因此,每当您的架构发生变化时,您都应该相应地更新种子并执行 migrate:fresh --seed 。至少,这就是我正在做的事情。

正如你已经在做的那样,我想知道是什么让它成为一个麻烦的过程"为了你。你能详细说明吗?

答案 1 :(得分:1)

根据你的解释,我想我明白了。

你的播种者应该做的第一件事是删除所有东西,所以你总是从一个空数据库开始,至少应该关注播种机。

我还会仔细查看文档https://laravel.com/docs/5.2/seeding,特别是“使用模型工厂”一节。

public function run()
{
    factory(App\User::class, 50)->create()->each(function($u) {
        $u->posts()->save(factory(App\Post::class)->make());
    });
}

在这种情况下,你会做类似的事情,除了你从顶部开始为你user_types,然后对于你创建的每种类型,它会生成你需要的许多用户。这看起来与您当前的过程有点不同,听起来每个表都有一个播种器文件。

这样,您可以处理父/子关系,并在代码中非常清楚,将来很容易添加其他项目。另外,因为每次播种器运行时你都是从头开始,所以你可以确定这适用于新的和现有的开发者。