【发布时间】:2019-07-04 08:59:02
【问题描述】:
我的目标是使用 Symfony 表单来允许用户选择多个兴趣并将这些与他们的用户相关地保存。
我有三个实体来映射和存储这些数据:
User
- id
- name
Interest
- id
- name
UserInterest
- id
- user_id (FK ManyToOne user.id)
- interest_id (FK ManyToOne interest.id)
我正在努力寻找最动态的 Symfony 方法来处理 User 的 Interests 并将其保存到 UserInterest 实体。
InterestsController.php
public function interests(Request $request)
{
$error = null;
$userInterests = new UserInterest();
$userInterests->setUser($this->getUser());
$form = $this->createForm(UserAccountInterests::class, $userInterests);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$this->entityManager->persist($userInterests);
$this->entityManager->flush();
} catch (\Exception $e) {
$error = $e->getMessage();
}
}
$parameters = [
'error' => $error,
'user_interests_form' => $form->createView()
];
return $this->render('user/interests.html.twig', $parameters);
}
UserInterestsType.php
class UserInterestsType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('interest', EntityType::class, [
'class' => Interest::class,
'choice_label' => 'name',
'expanded' => true,
'multiple' => true
])
->add('update', SubmitType::class);
}
}
问题
我目前面临的问题是,在提交表单时,这会创建一个链接到user 的UserInterest 实体的实例化,但将多个选定的Interest 作为数组而不是多个UserInterest。
我怎样才能以正确的 Symfony 方式执行此操作,以允许一个表单和简单的控制器逻辑,以便用户可以加载页面,从多个复选框类型中选择他们的兴趣,单击保存,然后当重新加载表单时它们是自动填充为先前的选择?
【问题讨论】:
-
在您的情况下,您需要
CollectionType而不是EntityType。集合类型entry_type应该是 InterestType。检查 CollectionType 文档
标签: php symfony symfony4 symfony-forms