I recently started learning Symfony, and I've been passing integer values to foreign keys in other projects before, but this is different with Doctrine, as the foreign key methods accept an object, not a number. I understand that I can rewrite the methods, but I don't want to break the Doctrine mapping, and I want to understand how it works.
Example: I have two entities, Institute
and Department
, with a Many-to-One relationship (an "Institute" has many "departments"). Department
has a foreign key "institute_id". How exactly do I need to pass the data so that I can fill the Departments table?
Institute:
Department:
Fixture file:
namespace App\DataFixtures;
// ...
use App\Entity\Department;
// ...
use App\Entity\Institute;
// ...
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use function Zenstruck\Foundry\faker;
class AppFixtures extends Fixture
{
public function load(ObjectManager $manager): void
{
$instituteList = [
'Институт информационных технологий и кибербезопасности',
'Институт телекоммуникаций и радиотехники',
'Институт бизнеса и социальных коммуникаций',
'Институт электроники, автоматизации и метрологии'
];
$departmentList = [
'Кафедра инженерии программного обеспечения',
'Кафедра компьютерных наук',
'Кафедра кибербезопасности и технических наук',
'Кафедра компьютерной инженерии и информационных систем',
'Кафедра национальной безопасности и управление общественным развитием',
'Кафедра радиоэлектронных систем и технологий',
'Кафедра коммутационных систем электронных коммуникаций',
'Кафедра систем электронных коммуникаций',
'Кафедра автоматизации и компьютерно-интегрированных технологий',
'Кафедра менеджмента и маркетинга',
'Кафедра социально-гуманитарных наук',
'Кафедра лингводидактики и иностранных языков',
'Кафедра журналистики, социальных коммуникаций и IT-права',
'Кафедра общественного управления и цифровой экономики',
'Кафедра психологии и реабилитации',
'Кафедра электроники, транспортных технологий и логистики',
'Кафедра метрологии, качества и стандартизации',
'Кафедра физико-математических наук'
];
for ($i = 0; $i < count($instituteList); $i++) {
$institute = new Institute();
$institute->setName($instituteList[$i]);
$manager->persist($institute);
}
for ($i = 0; $i < count($departmentList); $i++) {
$department = new Department();
$department->setName($departmentList[$i]);
$department->setInstitute(rand(1,4));
$manager->persist($department);
}
...
$manager->flush();
}
}```
$department->setInstitute(rand(1,4));
looks strange to me - how does setInstitute
look like?
If setInstitute
is a common setter, it should require you to use a Institute
entity as a parameter. Something like this should work:
$instituteEntities = [];
for ($i = 0; $i < count($instituteList); $i++) {
$institute = new Institute();
$institute->setName($instituteList[$i]);
$manager->persist($institute);
$instituteEntitites[] = $institute;
}
for ($i = 0; $i < count($departmentList); $i++) {
$department = new Department();
$department->setName($departmentList[$i]);
$department->setInstitute(array_rand($instituteEntitites);
$manager->persist($department);
}