迁移时在db中创建条目的symfony方法是什么?

迁移时在db中创建条目的symfony方法是什么?,symfony,migration,Symfony,Migration,我有一个通过迁移创建的数据库,它是空的,而我希望它被填充 假设我有一个名为“books”的表,其中有“title”和“author”。我想确定的是,至少“Kendall Crolius”的“用狗毛编织”是DB中的一个条目 我知道如何在SQL中实现这一点,当然,我可以简单地在构建过程中放入一个脚本,它执行一个命令来检查这样一个条目是否存在,如果不存在,则创建它 但是在迁移/设置时,在DB中创建条目的Symfony方法是什么?我想您需要的是: 您只需使用装置编写一个文件(指定Kendall Crol

我有一个通过迁移创建的数据库,它是空的,而我希望它被填充

假设我有一个名为“books”的表,其中有“title”和“author”。我想确定的是,至少“Kendall Crolius”的“用狗毛编织”是DB中的一个条目

我知道如何在SQL中实现这一点,当然,我可以简单地在构建过程中放入一个脚本,它执行一个命令来检查这样一个条目是否存在,如果不存在,则创建它


但是在迁移/设置时,在DB中创建条目的Symfony方法是什么?

我想您需要的是:

您只需使用装置编写一个文件(指定Kendall Crolius等),并在迁移过程结束时运行以下命令:

php bin/console doctrine:fixtures:load

我不建议使用fixture,因为它们用于测试和开发环境,库应该位于composer.json中的requiredev部分。
您应该使用迁移创建实体

您要寻找的是数据装置。我认为两个最受欢迎的选择是:

使用前者,您可以在如下代码中创建装置(取自文档):

类AppFixtures扩展了Fixture
{
公共函数加载(ObjectManager$manager)
{
//创造20个产品!砰!
对于($i=0;$i<20;$i++){
$product=新产品();
$product->setName('product'.$i);
$product->setPrice(百万兰特(10100));
$manager->persist($product);
}
$manager->flush();
}
}
您可以使用
bin/console条令:fixtures:load
运行它们

鉴于后者使用YAML:

App\Entity\Dummy:
虚拟_{1..10}:
姓名:
相关虚拟:“@related虚拟*”
添加装置的命令是:
bin/console hautelook:fixtures:load

AliceBundle还具有集成带来的其他好处,可以像您建议的那样生成随机数据和静态数据

编辑:使用夹具文件的主要原因是希望独立于基础数据库。当您使用SQL脚本时,可能需要为每个受支持的数据库保留多个版本,有时甚至需要针对不同的版本(例如MySQL 5.7和MySQL 8)对其进行调整。另一个好处是,在这些文件的版本历史记录中跟踪更改通常比在SQL中更容易,但这是有争议的。由于条令装置是用代码编写的,所以您可以使用检查工具检查它们是否与您的实体同步,以便在需要更改它们时更容易发现


也就是说,如果这些好处都不是一个参数,并且您希望使用SQL脚本,那么您应该将模式更改和插入数据分开,以防止出现任何问题。可以说,您也不应该使用迁移来插入数据。您可能会因为ID已被使用而面临迁移失败的风险,也可能不依赖ID,从而难以管理数据之间的关系。您可以通过执行
INSERT IGNORE
来避免问题,但这样您将很难确定数据是否处于预期的状态,并有不一致的风险。

使用SQL查询迁移(INSERT)。
不要按实体管理器添加实体,因为您的实体可以更改(例如:添加必填字段,之后将执行错误的迁移)

我不确定对数据装置使用迁移是否是一个好主意。这可能会有问题,因为您的夹具数据可能与数据库中的“真实”/预先存在的数据冲突,并会使回滚到旧版本成为问题,例如,您会删除数据(即使您不知道它是否由夹具创建)还是保留它?是的,这是我的第一个意图。但问题是如何迁移?迁移旨在更新生产数据库。假设你已经部署了你的应用程序,使用了一段时间,并且添加了一堆书。现在,您决定使用迁移将另一列添加到图书中。你真的想把你的狗毛书添加到你的产品数据库中吗?我猜不是,但你真的需要决定你想发生什么。为数据库设定种子可能最好留给一个单独的fixture过程(如下面几个答案中所述),该过程将离线完成。在具有多个(例如live、dev和local)环境的应用程序中,这会是什么样子?谢谢,这将满足我的要求,但SQL脚本也会如此。为什么我更喜欢fixture呢?谢谢,这会满足我的需求,但是SQL脚本也是如此。为什么我更喜欢固定装置呢?请看。混合使用fixture和模式更改可能有风险,因为根据迁移的时间/地点,数据可能具有不同的状态。例如,假设您希望一个新角色具有特定的id,但由于有人更改了实时系统上的现有角色,因此在prod上采用了该id。您可能会弄乱数据,否则您的迁移将变得不可靠。所以,您不建议使用fixture?我不建议将fixture与迁移混合使用。我能想到的主要缺点是,如果您支持不同的数据库,比如MySQL和Postgres,那么您将需要维护多个脚本。管理SQL脚本也有点困难。特别是对于条令固定装置,即代码中的固定装置,您可以从静态代码分析中获益,静态代码分析将告诉您固定装置何时变得不同步。在模型更改时更新SQL fixture可能比在YAML中更难查看,但这只是一个小缺点。如果您决定这样做,还可以添加如何从命令行执行fixture