Для этого у меня есть класс BaseFixture, который имеет функцию createMany
protected function createMany(string $classname, int $count, callable $factory)
{
for ($i = 0; $i < $count; $i++) {
$entity = new $classname();
$factory($entity, $i);
$this->manager->persist($entity);
$this->addReference($classname.'_'.$i, $entity);
}
}
и функцию getRandomReference:
protected function getRandomReference(string $className)
{
if (!isset($this->referencesIndex[$className])) {
$this->referencesIndex[$className] = [];
foreach ($this->referenceRepository->getReferences() as $key => $ref) {
if (strpos($key, $className.'_') === 0) {
$this->referencesIndex[$className][] = $key;
}
}
}
if (empty($this->referencesIndex[$className])) {
throw new \Exception(sprintf('Cannot find any references for class "%s"', $className));
}
$randomReferenceKey = $this->faker->randomElement($this->referencesIndex[$className]);
return $this->getReference($randomReferenceKey);
}
Теперь, скажем, я хочу создать приборы длякласс компании и класс адреса,
Сначала я сгенерирую данные для адреса:
class AddressFixtures extends BaseFixture {
public function loadData {
this->createMany(Address::class, 30, function(Address $address, $count) {
$address->setDescription($this->faker->paragraph);
...
});
}
}
Поскольку я использовал класс createMany из базового класса, ссылки теперь добавляются автоматически длякаждый прибор.
теперь мы можем получить случайные адреса для приборов нашей компании, используя функцию getRandomReference из нашего базового класса:
class CompanyFixtures extends BaseFixture implements DependentFixtureInterface
{
public function loadData(ObjectManager $manager)
{
$company = new Company();
$company->setAddress($this->getRandomReference(Address::class));
}
}
Я просто хочу отметить, что большая часть этого, если нетвсе (я точно не помню, это было давно) взято из учебника SymfonyCasts, которому я следовал.