Forms 同一字段多次使用Symfony 4表格

Forms 同一字段多次使用Symfony 4表格,forms,symfony,entity,repeat,Forms,Symfony,Entity,Repeat,我有一个实体报告,其中包含许多答案 class Report { /** * @ORM\OneToMany(targetEntity="App\Entity\Answer", mappedBy="report") */ private $answers; ... } class Answer { /** * @ORM\ManyToOne(targetEntity="Report", inversedBy="answers")

我有一个实体报告,其中包含许多答案

class Report
{
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Answer", mappedBy="report")
     */
     private $answers; 
     ...
}

class Answer
{

    /**
     * @ORM\ManyToOne(targetEntity="Report", inversedBy="answers")
     */
     private $report;
     ...
}
我在我的报告类型中手动添加问题(我知道这不是最好的方法,但问题永远不会改变,我只对答案感兴趣。)

我想做的是生成一个包含3个问题的表单,并将每个答案插入数据库中。
但是呈现的表单只显示最后一个问题(因为通过each->add('answers',…)我替换了最后一个添加的问题)

我尝试了不同的解决方案:

  • 遵循上的文档,其中包括将每个答案(带有问题标签)添加到控制器中的报告中,然后呈现ReportType。这方面的问题是,我的每个问题都有不同的类型(选项、文本、整数…),我不知道如何单独定制它们
  • 我也试着在我的ReportType中这样做,但它只显示添加的最后一个问题

谢谢你的帮助,谢谢

您可以使用实体-属性-值模型来解决此问题。我建议使用sidus/eav模型包。这将是一个很大的工作,但你会学到很多。使用EAV模型,您可以有N个问题和答案。
我想不出用简单的表单类型来解决这个问题

我设法让它工作起来了。最后,我按照上的说明进行操作。
为了使其正常工作,我将问题问题类型字段添加到我的答案实体中。在AnswerType.php上,我每次都会检查问题的类型,然后根据它创建答案的类型。看起来是这样的:

 $builder->addEventListener(FormEvents::POST_SET_DATA, function ($event) {
        $builder = $event->getForm();
        $answer = $event->getData();
        $questionType = $answer->getQuestionType();
        $question = $answer->getQuestion();
        if ($questionType == 1){
            $builder->add('answer', ChoiceType::class, array(
                'label' => $question,
                'multiple' => false, 'expanded' => false,
                'choices'  => array('OK' => 'OK', 'NG' => 'NG', 'NP' => 'NP',),
            ));
        }
        else if($questionType == 2){
            $builder->add('answer', ChoiceType::class, array(
                'label' => $question,
                'multiple' => false, 'expanded' => false,
                'choices'  => array('SI' => 'SI', 'NO' => 'NO',),
            ));
        }
       else ...
 }
 $builder->addEventListener(FormEvents::POST_SET_DATA, function ($event) {
        $builder = $event->getForm();
        $answer = $event->getData();
        $questionType = $answer->getQuestionType();
        $question = $answer->getQuestion();
        if ($questionType == 1){
            $builder->add('answer', ChoiceType::class, array(
                'label' => $question,
                'multiple' => false, 'expanded' => false,
                'choices'  => array('OK' => 'OK', 'NG' => 'NG', 'NP' => 'NP',),
            ));
        }
        else if($questionType == 2){
            $builder->add('answer', ChoiceType::class, array(
                'label' => $question,
                'multiple' => false, 'expanded' => false,
                'choices'  => array('SI' => 'SI', 'NO' => 'NO',),
            ));
        }
       else ...
 }