一种形式的多个实体[Symfony 3]

时间:2017-10-02 11:53:44

标签: php forms symfony collections formbuilder

以下是我的表格:

电影

  • id
  • 姓名
  • 描述

  • ID
  • 名称
  • DATE_OF_BIRTH

角色

  • ID
  • 名称
  • movie_id
  • 为person_id

所以,电影显然应该包含电影。人由人(演员,导演或作家)组成。表Role通过在其类中包含$movie$person变量与其他2个表连接,两者之间具有多对一关系,最终导致 movie_id & 为person_id

我想要实现的是拥有表单,我可以插入新电影,还可以插入相关演员,导演和电影。写入器(或多个)。

最终表单结果应包含以下字段:

  • movie_name,movie_year,movie_description
  • 从DB(person.name)
  • 列出的人员列表
  • 下拉有3种可能性 - 演员,导演,作家(最终会被插入数据库)

因此,在填写前三个输入后,用户从下拉列表中选择一个人,然后为所选人选择适当的角色。如果我正确思考,我应该能够从人物(姓名)表中选择,然后插入到电影中(名称,年份,描述)&角色(name,movie_id,person_id)表。

我知道我应该使用Form collections,但我不明白如何使用它们,至少在这种情况下。我想我应该从创建类似RoleModel类的东西开始,但不确定在进入此之前我是否犯了错误,这使得这个问题比它应该更复杂。 我的问题确实是 - 如何使用表单集合

如果需要,我可以提供任何必要的代码。

2 个答案:

答案 0 :(得分:0)

Symfony让它变得非常简单,首先,您需要在您的个人实体和电影实体之间添加双向关系(一对多),因此您需要:

  • 将名为person的属性添加到您的电影实体:

代码:

/**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Person", inversedBy="movies")
 */
protected $person;
  • 将名为movies的属性添加到您的个人实体:

代码:

/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Movie", mappedBy="person")
 */
protected $movies;

现在,您可以在MovieType文件(表单配置文件)中执行以下操作:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('year')
        ->add('description', TextareaType::class)
        ->add('person', EntityType::class, array(
            'class'        => Person::class, //This existed usually in (AppBundle\Entity\Person)
            'choice_label' => 'name'
        ));
}

这是关于如何在Symfony中使用EntityType的简单演示。

祝你好运。

答案 1 :(得分:0)

您可以通过嵌入FormTypes来解决这个问题,您可以创建一个由PersonFormTypeMovieFormType组成的新组合,并且它需要一个额外的字段用于角色类型(导演,演员)等) 然后,在提交之后,您可以检索到这样的对象:

// SomeController's action
...
$data = $form->getData();
$person = $data['person'] // or whatever is the name of the field

您可以在文档中找到有关嵌入FormTypes的更多信息:https://symfony.com/doc/cur ...