У меня есть Entity Отчет, который содержит много Ответы.
class Report
{
/**
* @ORM\OneToMany(targetEntity = "App\Entity\Answer", mappedBy = "report")
*/
private $answers;
...
}
class Answer
{
/**
* @ORM\ManyToOne(targetEntity = "Report", inversedBy = "answers")
*/
private $report;
...
}
Я вручную добавляю вопросы в свой Тип отчета (я знаю, что это не лучший подход, но вопросы никогда не изменятся, и меня интересуют только ответы).
class ReportAnswersType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('answers', ChoiceType::class, array(
'label' => 'Room state',
'multiple' => false, 'expanded' => false,
'choices' => array('OK' => 'OK', 'NG' => 'NG', 'NP' => 'NP',),
))
->add('answers', IntegerType::class, array(
'label' => 'Temperature',
))
->add('answers', ChoiceType::class, array(
'label' => 'Is it good?',
'multiple' => false, 'expanded' => false,
'choices' => array('YES' => 'YES', 'NO' => 'NO',),
))
...
}
->add('save', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Report::class,
));
}
Я бы хотел, чтобы это сгенерировало форму с 3 вопросами и вставило каждый из ответов в базу данных. Но визуализированная форма показывает только последний вопрос (потому что с каждым -> добавить ('ответы', ...) я заменяю последний добавленный).
Я пробовал разные решения, чтобы решить эту проблему:
Я ценю любую помощь, спасибо!




Вы можете использовать модель Entity – Attribute – Value для решения этой проблемы. Я бы посоветовал использовать sidus / eav-model-bundle. Это будет большая работа, но вы многому научитесь. Используя модель 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 ...
}