【发布时间】:2016-09-26 07:45:47
【问题描述】:
我的实体中有多对多关联,我想使用 symfony 中的集合类型字段进行多次添加。 我以前从来没有这样做过,我有点迷路了。 我想多次拥有的字段是总部,每个总部都有一个非映射字段。 我得到的错误;
“AppBundle\Entity\SurveyManager”类中的属性“headquarter” 可以使用“addHeadquarter()”方法定义, "removeHeadquarter()" 但新值必须是数组或 \Traversable 的实例,给出“AppBundle\Entity\HeadQuarterManager”。
实现集合的表单类型。
class SurveyOptionType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('headquarter', CollectionType::class, [
'entry_type' => HeadQuarterType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'label' => 'Sediu',
])
->add('isEnabled', CheckboxType::class, [
'label' => 'Chestionar Activ',
'required' => false,
])
->add('submit', SubmitType::class, [
'label' => 'Salveaza',
]);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => SurveyManager::class
]);
}
}
这是收集表格
class HeadQuarterType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('headquarter', EntityType::class, [
'class' => HeadQuarterManager::class,
'label' => 'Sediu',
])
->add('userNumber', TextType::class, [
'label' => 'Numar Utilizatori',
'mapped' => false,
])
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => SurveyManager::class
]);
}
}
更新:
这是从所有不必要的数据中剥离出来的 Entity 类
class SurveyManager
{
/**
* @var int
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\HeadQuarterManager")
* @ORM\JoinTable(name="survey_headquarters",
* joinColumns={@ORM\JoinColumn(name="survey_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="headquarter_id", referencedColumnName="id")}
* )
*/
private $headquarter;
public function __toString()
{
// TODO: Implement __toString() method.
return $this->name;
}
/**
* Constructor
*/
public function __construct()
{
$this->question = new \Doctrine\Common\Collections\ArrayCollection();
$this->headquarter = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add headquarter
*
* @param \AppBundle\Entity\HeadQuarterManager $headquarter
*
* @return SurveyManager
*/
public function addHeadquarter(\AppBundle\Entity\HeadQuarterManager $headquarter)
{
$this->headquarter[] = $headquarter;
return $this;
}
/**
* Remove headquarter
*
* @param \AppBundle\Entity\HeadQuarterManager $headquarter
*/
public function removeHeadquarter(\AppBundle\Entity\HeadQuarterManager $headquarter)
{
$this->headquarter->removeElement($headquarter);
}
/**
* Get headquarter
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getHeadquarter()
{
return $this->headquarter;
}
}
控制器方法
$em = $this->getDoctrine()->getManager();
$surveyRepository = $em->getRepository(SurveyManager::class);
//$surveyManager = $surveyRepository->findOneById($surveyId);
$surveyManager = new SurveyManager();
$form = $this->createForm(SurveyOptionType::class, $surveyManager);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($surveyManager);
$em->flush();
return $this->redirectToRoute('admin_survey-manager_survey_options',
[
'id' => $surveyManager->getId()
]);
}
return [
'surveyManager' => $surveyManager,
'form' => $form->createView(),
];
在对此进行研究时,我做了一个单独的演示来测试它以更好地了解问题。
这是一个经过简化的更新代码,应该可以非常流畅地运行
https://gist.github.com/bogdaniel/a0bcc848e2bd282382f45a2bd15cc0e2
您将在要点中找到有关错误的更多信息。
【问题讨论】:
-
不清楚您要归档什么。请提供总部、SurveyManager、Controller的定义。并解释它是什么意思 - “我想多次拥有的字段是总部,每个总部都有一个非映射字段。”。总部没有映射到总部?这里没有错字?