我已经为两个有ManyToMany关系的实体制作了夹具。我的ColorFixtures
加载,然后是我的FabricFixtures
。如下面的代码所示,我使用ColorRepository
向布料添加了颜色。我总是收到以下错误:
Argument 1 passed to App\Entity\Fabric::addColor() must be an instance of App\Entity\Color, null given, called in /var/www/html/src/DataFixtures/FabricFixtures.php on line 44
因此,我尝试进行更深入的研究,结果是,在ColorFixtures加载结束时,我的颜色ID从222变为241(因为我已经尝试了很多次来加载这些灯具了,所以id一定是较低的数字,因为我转储的下一次加载的id是242到261,而我尝试的唯一ID是221)。
因此,当然,当我使用ColorRepository在FabricFixtures中找到ID 1到20时,颜色为null,因为此时id是200倍。
当我在Fixtures处理之后(在控制器中)转储颜色时,ids正确地设置为1到20。因此,我的问题是:为什么在Fixtures中实体的ids不会从1开始递增?我猜想以前有一些Fixtures的缓存,但是我真的不知道,如果确实如此,为什么还要缓存。如何确保id总是以1开始递增,以便可以安全地为布料添加颜色?
注意:即使在运行bin/console cache:clear
之后,“临时”标识仍在增加(我上次转储时是282到301)。
注2:我不知道这是否重要,但我使用的是Symfony 5和doctrine / doctrine-fixtures-bundle 3.3
注3:我认为this是一个相关问题,在阅读维护者的回答后,我了解到我不应该依赖另一个实体中我实体的递增ID。我听得懂吗如果是这样,您对我如何建立布料和颜色之间的关系有什么帮助?
注4:实际上,除了工作和学校,这是我一个月以来一直在从事的个人项目,我首先开始与Laravel进行开发,然后与Symfony一起进行学习。框架,然后回到Laravel,因为我更喜欢这个框架,现在我又回到了Symfony(最后!)。在Laravel版本中,我只是做了一个FabricColor“ Fixtures”,在其中我进行了数据库查询,以将原始ID添加到数据库表中。那是我在Symfony中应该怎么做?最后,我的问题不应该是:制作具有ManyToMany关系的夹具的最佳方法是什么?”
非常感谢!
FabricFixtures
(我使用̀DependentFixtureInterface`来确保ColorFixtures在FabricFixtures之前有效加载)
<?php
namespace App\DataFixtures;
use App\Entity\Fabric;
use App\Repository\ColorRepository;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Faker\Factory;
class FabricFixtures extends Fixture implements DependentFixtureInterface
{
/** @var ColorRepository */
private $colorRepository;
/**
* FabricFixtures constructor.
* @param ColorRepository $colorRepository
*/
public function __construct(ColorRepository $colorRepository)
{
$this->colorRepository = $colorRepository;
}
/**
* @param ObjectManager $manager
*/
public function load(ObjectManager $manager)
{
$faker = Factory::create();
for ($i = 0; $i < 30; $i++) {
$fabric = new Fabric();
$fabric->setBox(rand(1, 30));
$fabric->setMaterial($faker->word);
$fabric->setPattern($faker->word);
$fabric->setState($faker->word);
$fabric->setThickness($faker->word);
$fabric->setWidth(rand(100, 500));
$fabric->setLength(rand(100, 500));
$fabric->setComment($faker->words(5, true));
$fabric->addColor($this->colorRepository->find(rand(1, 20)));
$manager->persist($fabric);
}
$manager->flush();
}
/**
* @inheritDoc
*/
public function getDependencies()
{
return [
ColorFixtures::class
];
}
}
在加载过程中创建的颜色转储
App\Entity\Color^ {#558
-id: 221
-name: "name"
-code: "code"
-fabrics: Doctrine\ORM\PersistentCollection^ {#542
-snapshot: []
-owner: App\Entity\Color^ {#558}
-association: array:16 [ …16]
-em: Doctrine\ORM\EntityManager^ {#171 …11}
-backRefFieldName: "color"
-typeClass: Doctrine\ORM\Mapping\ClassMetadata {#451 …}
-isDirty: false
#collection: Doctrine\Common\Collections\ArrayCollection^ {#545
-elements: []
}
#initialized: true
}
}