0

我有我的迁移文件,它为数据库创建初始架构,我有我的种子文件,它使用随机数据和设置类型填充初始架构。

我对迁移和种子的理解是,每当有新团队成员加入时,他都可以运行它们并跟上所有数据库更改和产品工作所需的数据,此外,您可以将更改应用于 stg 和通过运行迁移文件来生产。

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

我遇到的问题是工匠使用迁移和种子的方式是它首先运行所有迁移,然后运行所有种子,我似乎没有办法指定它们的顺序应该运行。所以,如果我运行migrate:refresh --seed我会出错,因为它应用了最新的迁移,它会在种子插入他自己的数据之前插入新数据(可能会也可能不会,取决于种子中插入的类型) .

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

在这种情况下,迁移和种子的预期用途是什么?

更新 为了更清楚地说明:假设我有一个创建用户的迁移: 用户:{id,name,type} 我有我的种子来创建用户。

我运行两者,并且我有一个包含一堆用户的用户表。

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

开发人员运行迁移,他们的数据库都是最新的。

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

现在,如果我们更新种子以匹配最新的,我们将遇到 user_types 表的重复数据。为了避免这种情况,我们需要在迁移中加入某种防御性代码,以便在没有数据时不运行任何东西,如果有则更新。

问题是,这是使用迁移的正确方法吗?您如何将数据更改推送给所有开发人员,而无需重新运行种子?

4

2 回答 2

2

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

由于您已经这样做了,我想知道是什么使它成为您的“麻烦的过程”。你能详细说明吗?

于 2016-03-17T17:47:45.310 回答
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,然后对于它创建的每种类型,它会生成你需要的任何用户。这似乎与您当前的流程有点不同,听起来您每个表都有一个播种器文件。

这样,您就可以处理父/子关系并在代码中非常清晰,并且将来很容易添加其他项目。此外,因为每次播种机运行时您基本上都是从头开始,您可以确定这将适用于新的和现有的开发人员。

于 2016-03-17T18:08:35.587 回答