我正在尝试用3个实体构建一个quizz: Quizz,Question和QuestionAnswer。
Quizz嵌入了一个问题集合,我需要显示所有可能的答案。
这是我的表单构建器:
QuizzType:
$builder->add('questions', 'collection', array('type' => new QuestionType(),'options' => array('label' => false)));
QuestionType:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$this->currentQuestion = $event->getData();
$form = $event->getForm();
$form->add('answers', 'entity', array(
'label' => $this->currentQuestion->getValue(),
'multiple' => false,
'expanded' => true,
'property' =>'value',
'class' => 'MyQuizzBundle:QuestionAnswer',//*/
'query_builder' => function (EntityRepository $er) {
$tmp = $er->createQueryBuilder("a")
->where("a.question = 1");
return $tmp;
},
));
});
QUIZZ:
/**
* @ORM\OneToMany(targetEntity="Question", mappedBy="quizz")
*/
private $questions;
问题:
/**
* @ORM\OneToMany(targetEntity="QuestionAnswer", mappedBy="question", cascade={"persist"})
*/
private $answers;
问题答案:
/**
* @ORM\ManyToOne(targetEntity="Question", inversedBy="answers", cascade={"persist"})
*/
private $question;
我收到以下错误
Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
我一直试图找到一个小时的溶剂,我看到人们解决了这个问题,因为实体注释中有错误但我在这里找不到任何错误。
更新:以下是我实例化表单的方法:
$quizz = $this->getDoctrine()->getRepository("MyQuizzBundle:Quizz")->find(1);
$this->getDoctrine()->getManager()->persist($quizz);
$form = $this->createForm(new QuizzType(), $quizz);
经过一些测试后,我试图不实例化这个问题而只是回答一个问题,我仍然得到错误:
$question = $this->getDoctrine()->getRepository("QuizzBundle:Question")->find(1);
$this->getDoctrine()->getManager()->persist($question);
$form = $this->createForm(new QuestionType(), $question);
仅当我尝试将字段显示为单选按钮(expand = true且multiple = false)时才会引发错误。 如果我将其显示为复选框或选择,我没有错误。
这是一个已知的错误还是我做错了什么?
更新2: 看起来我可以将它显示为收音机,如果我设置了'映射'属性为false:
$form->add('answers', 'entity', array(
'label' => $this->currentQuestion->getValue(),
'multiple' => false,
'expanded' => true,
'property' =>'value',
'mapped' => false,
'class' => 'MyQuizzBundle:QuestionAnswer',//*/
'query_builder' => function (EntityRepository $er) {
$tmp = $er->createQueryBuilder("a")
->where("a.question = 1");
return $tmp;
},
));
显然我想避免使用'映射' => false,所以我可以在用户提交表单后使用我的控制器中的值。