Symfony 4. ManyToMany 与属性的关联.自定义表单插入属性值,我该怎么做? [英] Symfony 4. ManyToMany association with attribute. Custom form to insert attribute value, how do I?
问题描述
Symfony 4 项目.我看不到如何编写以下规范.
假设我有两个实体 Alpha 和 Beta.当我创建一个 Alpha 对象 alpha 时,我希望将 (ManyToMany) 关联到一个或多个 Beta 对象.我知道如何渲染新表单和编辑表单.
我希望用一个属性来丰富 AlphaBeta 连接表,比如将 Beta 与 Alpha 相关联的 成本.问题是,当我创建一个 Alpha 对象并将其关联到一个 Beta 对象时,我无法丰富上述表单以插入或编辑 Cost 值.
是否有一种标准方法可以对这种情况进行编码?
我读到要走的路是有两个 OneToMany 关联 Alpha->AlphaBeta 和 Beta->AlphaBeta,但即使这样做,我也无法为 Alpha 定义/渲染表单以创建新的 Alpha 对象, 将一个 Beta 对象(或更多)与其关联,并为这种关联分配一个 Cost 值.
非常欢迎您的建议.谢谢
看来我确实找到了方法,确实是非常简单的 Synfony 4 代码.
希望它对某人有用.
(注意:我使用 php bin/console make:entity/crud/form
来编写所需的脚本.下面是我如何修改从 make
)
所以,假设我有 Alpha 和 Beta 实体.我希望有一个表单来创建一个新的 Alpha 对象,将一个或多个 Beta 对象与其关联,并为每个 Alpha-Beta 关联填写一个成本值.我也想要一个编辑表单.
首先我创建一个新的 AlphaBeta 实体,其字段为:
/*** @ORM\ManyToOne(targetEntity="App\Entity\Alpha", inversedBy="alphabetas", cascade={"persist"})* @ORM\JoinColumn(nullable=false)*/私人 $alpha;/*** @ORM\ManyToOne(targetEntity="App\Entity\Beta", inversedBy="betaalphas", cascade={"persist"})* @ORM\JoinColumn(nullable=false)*/私人 $beta;/*** @ORM\Column(type="string", length=255, nullable=true)*/私人$成本;
在 Alpha
类中,我需要
/*** @ORM\OneToMany(targetEntity="App\Entity\AlphaBeta",mappedBy="alpha",orphanRemoval=true,cascade={"persist"})*/私人 $alphabetas;
使用通常的 'getAlphaBeta
、addAlphaBeta
和 removeAlphaBeta
方法.(类似于Beta
)
我为新的 AlphaBeta
实体创建了常用的 CRUD 控制器.为了有一个也可以用作子表单的 AlphaBeta 表单,我定义了
class `AlphaBetaEmbeddedForm` 扩展 AbstractType {公共函数 buildForm(FormBuilderInterface $builder, array $options){$builder ->add('Beta', EntityType::class, array('类' =>测试版::类,'多个' =>错误的,'扩展' =>真的,'选择标签' =>'betaTitle' ))->add('cost', TextType::class);如果(空($options['remove_alpha_field'])){$builder->add('Alpha', EntityType::class, array('类' =>阿尔法::班级,'多个' =>错误的,'扩展' =>真的,'选择标签' =>'字母标题'));}}公共函数 configureOptions(OptionsResolver $resolver){$resolver->setDefaults(['data_class' =>AlphaBeta::类,'remove_alpha_field' =>错误的,]);}}
remove_alpha_field
是 技巧 让我使用上面的表单作为表单中的子表单来创建 Alpha
对象:
class AlphaType 扩展 AbstractType {公共函数 buildForm(FormBuilderInterface $builder, array $options) {$builder->add('alphaTitle')->add('AlphaBetas', CollectionType::class, array('entry_type' =>AlphaBetaEmbeddedForm ::类,'entry_options' =>['标签' =>真,'remove_alpha_field' =>真的],'allow_add' =>真的,'标签' =>'贝塔斯','by_reference' =>错误的));}
要在主表单中呈现子表单,我需要一些 JS,如建议的 此处,插入Alpha
的new.html.twig
和edit.html.twig
模板中:
{% block javascripts %}