Php 我如何在Symfony 5中为与其他实体有关系的实体创建一个表单?

Php 我如何在Symfony 5中为与其他实体有关系的实体创建一个表单?,php,symfony,doctrine,relation,symfony5,Php,Symfony,Doctrine,Relation,Symfony5,大家好,提前谢谢你们的帮助! 假设我有一个Symfony5应用程序,其中包含以下实体: 英雄,职业,装甲组和装甲,武器组和武器。 它们之间的关系如下: 单一独特的英雄是一个职业、一个盔甲和一个的集合 武器 单个独特的职业可以包含多个英雄、多个装甲群和多个武器群 单一独特的盔甲组是许多盔甲的集合 单一独特的武器组是许多武器的集合 单一独特的盔甲是一个盔甲组的集合,专门用于一个职业 单一独特的武器位于一个武器组的集合中,专用于一个职业 这是一张图表: 我想创建一个HeroType表单,将盔甲和

大家好,提前谢谢你们的帮助! 假设我有一个Symfony5应用程序,其中包含以下实体: 英雄,职业,装甲组和装甲,武器组和武器。 它们之间的关系如下:

  • 单一独特的英雄是一个职业、一个盔甲和一个的集合 武器
  • 单个独特的职业可以包含多个英雄、多个装甲群和多个武器群
  • 单一独特的盔甲组是许多盔甲的集合
  • 单一独特的武器组是许多武器的集合
  • 单一独特的盔甲是一个盔甲组的集合,专门用于一个职业
  • 单一独特的武器位于一个武器组的集合中,专用于一个职业
这是一张图表:

我想创建一个HeroType表单,将盔甲和武器的选择限制为之前选择的职业,并将其显示为实体类型单选列表,其中的名称基于盔甲组的数据,以及武器组用于武器。所有类都有许多唯一的参数

以下是我不起作用的方式:

<?php
class HeroType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', NumberType::class, [
            'attr' => ['placeholder' => 'John Doe'],
            'label' => 'Hero name.',
            'required' => true,
            ])
            ->add('profession', EntityType::class, [
            'choice_label' => 'name',
            'class' => Profession::class,
            'group_by' => 'affiliation',
            'label' => 'Profession',
            'multiple' => false,
            'required' => false,
            ])
            ->add('item_armor', EntityType::class, [
            'choice_label' => 'model',
            'class' => ItemArmor::class,
            'group_by' => 'material',
            'label' => 'Armor',
            'multiple' => false,
            'required' => false,
            ])
            ->add('item_weapon', EntityType::class, [
            'choice_label' => 'model',
            'class' => ItemWeapon::class,
            'group_by' => 'material',
            'label' => 'Weapon',
            'multiple' => false,
            'required' => false,
            ])
            ->add('save', SubmitType::class, ['label' => 'Create Hero!']);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Hero::class,
            ''
        ]);
    }
}

您可能希望使用自定义查询(group by的工作方式与您希望的不同,它与实体无关):choice_标签是您希望在表单中用作标签的字段。我猜是“名字”还是“武器名”?是的,@Nek,你是对的。“Model”是基本名称。我相信我不会跳过使用自定义查询。正如我在文档或许多教程中看到的那样,我想以“正确的方式”学习Symfony,但有时需要编写原始代码:)感谢您的支持!希望其他人可能有一个基于Symfony的解决方案。我尝试使用EntityRepositories并获取表单中的所有可能性,但没有成功…你所说的“它无法获取属性”到底是什么意思?嗨,我遇到了一个错误:无法获取读取“App\Entity\buller”类中属性“material”的方法。因为该属性来自武器组,而不是武器实体本身。它们之间的关系如上所述。
<?php
class HeroType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', NumberType::class, [
            'attr' => ['placeholder' => 'John Doe'],
            'label' => 'Hero name.',
            'required' => true,
            ])
            ->add('profession', EntityType::class, [
            'choice_label' => function ($profession) {
                return $profession->getName();},
            'group_by' => function ($profession) {
                return $profession->getAffiliation();},
            'class' => Profession::class,
            'label' => 'Profession',
            'multiple' => false,
            'required' => false,
            ])
            ->add('item_armor', EntityType::class, [
            'choice_label' => function ($item_armor) {
                return $item_armor->getIdItemArmor()->getModel();},
            'group_by' => function ($item_armor) {
                return $item_armor->getIdItemArmor()->getMaterial();},
            'class' => ItemArmor::class,
            'label' => 'Armor',
            'multiple' => false,
            'required' => false,
            ])
            ->add('item_weapon', EntityType::class, [
            'choice_label' => function ($item_weapon) {
                return $item_weapon->getIdItemWeapon()->getModel();},
            'group_by' => function ($item_weapon) {
                return $item_weapon->getIdItemWeapon()->getMaterial();},
            'class' => ItemWeapon::class,
            'label' => 'Weapon',
            'multiple' => false,
            'required' => false,
            ])
            ->add('save', SubmitType::class, ['label' => 'Create Hero!']);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Hero::class,
            ''
        ]);
    }
}