phpsymfonydoctrine-ormdoctrine

Symfony Doctrine - How to pass data into a foreign key using fixture?


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();
    }
}```

Solution

  • $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);
    }