Php 我如何在Symfony 5中为与其他实体有关系的实体创建一个表单?
大家好,提前谢谢你们的帮助! 假设我有一个Symfony5应用程序,其中包含以下实体: 英雄,职业,装甲组和装甲,武器组和武器。 它们之间的关系如下:Php 我如何在Symfony 5中为与其他实体有关系的实体创建一个表单?,php,symfony,doctrine,relation,symfony5,Php,Symfony,Doctrine,Relation,Symfony5,大家好,提前谢谢你们的帮助! 假设我有一个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,
''
]);
}
}