Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何使用laravel迁移和种子正确处理数据库数据更改_Database_Laravel_Database Migration_Laravel Seeding - Fatal编程技术网

Database 如何使用laravel迁移和种子正确处理数据库数据更改

Database 如何使用laravel迁移和种子正确处理数据库数据更改,database,laravel,database-migration,laravel-seeding,Database,Laravel,Database Migration,Laravel Seeding,我有我的迁移文件,它为数据库创建初始模式,还有我的种子文件,它用随机数据和集合类型填充初始模式 我对迁移和种子的理解是,每当一个新的团队成员加入时,他都可以运行这些迁移和种子,并且能够跟上所有数据库更改和产品工作所需的数据,此外,您还可以通过运行迁移文件将更改应用于stg和prod 但是,随着我的项目的推进,新类型的数据不断涌现,应用它们的唯一方法是创建一个迁移,该迁移将在数据库中运行insert 我的问题是artisan处理迁移和种子的方式是,它首先运行所有迁移,然后运行所有种子,而我似乎没有

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

我对迁移和种子的理解是,每当一个新的团队成员加入时,他都可以运行这些迁移和种子,并且能够跟上所有数据库更改和产品工作所需的数据,此外,您还可以通过运行迁移文件将更改应用于stg和prod

但是,随着我的项目的推进,新类型的数据不断涌现,应用它们的唯一方法是创建一个迁移,该迁移将在数据库中运行insert

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

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

在这个场景中,迁移和种子的预期用途是什么

更新 为了更清楚地说明这一点: 假设我进行了迁移以创建用户: 用户:{id,名称,类型} 我有我的种子来创造用户

我两者都运行,并且我有一个用户表,其中有一群用户

随着时间的推移,我们决定需要一个用于用户类型的表。 将创建一个迁移,该迁移将创建新表,并填充新用户类型和更新的数据,以匹配当前user.type到user.type\u id

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

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

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


问题是,这是使用迁移的正确方法吗?如何将数据更改推送到所有开发人员身上,而不必重新运行seed?

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


既然你已经这么做了,我想知道是什么让你觉得这是一个“麻烦的过程”。你能详细说明一下吗?

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


既然你已经这么做了,我想知道是什么让你觉得这是一个“麻烦的过程”。你能详细说明一下吗?

听你的解释,我想我明白了

您的播种机应该做的第一件事是删除所有内容,以便始终从一个空数据库开始,至少在播种机应该关注的地方

我还要仔细看一下文档,特别是“使用模型工厂”一节

在这种情况下,您可以做一些类似的事情,除了从顶部开始,对您来说是
user\u types
,然后对于它创建的每个类型,它将生成您需要的用户数量。这似乎与您当前的流程有点不同,您当前的流程听起来好像每个表都有一个播种器文件


通过这种方式,您可以在代码中处理和明确父/子关系,并且很容易在将来添加其他项。此外,由于每次播种机运行时基本上都是从零开始,因此您可以确定这将适用于新的和现有的开发人员。

根据您的解释,我想我理解了

您的播种机应该做的第一件事是删除所有内容,以便始终从一个空数据库开始,至少在播种机应该关注的地方

我还要仔细看一下文档,特别是“使用模型工厂”一节

在这种情况下,您可以做一些类似的事情,除了从顶部开始,对您来说是
user\u types
,然后对于它创建的每个类型,它将生成您需要的用户数量。这似乎与您当前的流程有点不同,您当前的流程听起来好像每个表都有一个播种器文件


通过这种方式,您可以在代码中处理和明确父/子关系,并且很容易在将来添加其他项。此外,由于每次种子机运行时基本上都是从零开始,因此可以确定这对新开发人员和现有开发人员都有效。

也许我误解了,但我没有想到数据库结构可以或应该依赖于实际数据的场景。它们是外键问题吗?在创建子数据之前,您需要在其中创建父数据?我使用Scenario更新了描述,种子程序应该重新运行。每个播种机都有一个
Model::truncate()
作为起点。也许我误解了,但我没有想到数据库结构可以或应该依赖于实际数据的场景。它们是外键问题吗?在创建子数据之前,您需要在其中创建父数据?我使用Scenario更新了描述,种子程序应该重新运行。每个播种机都有一个
Model::truncate()
作为起点。是的,我们希望迁移能够帮助我们避免这样做:每次进行新更改时都必须刷新。那么
public function run()
{
    factory(App\User::class, 50)->create()->each(function($u) {
        $u->posts()->save(factory(App\Post::class)->make());
    });
}