最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

programmeradmin6浏览0评论

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:

  • id
  • name

Department:

  • id
  • name
  • institute_id

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

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:

  • id
  • name

Department:

  • id
  • name
  • institute_id

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();
    }
}```
Share Improve this question edited Mar 27 at 9:22 yivi 47.7k18 gold badges130 silver badges154 bronze badges asked Mar 26 at 12:55 Славик МихненкоСлавик Михненко 351 gold badge1 silver badge5 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 2

$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);
}
发布评论

评论列表(0)

  1. 暂无评论