【发布时间】:2025-12-07 19:05:02
【问题描述】:
我将两个相关实体关联起来:Magazine 和 Issue 与 OneToMany 关系。 如何创建表单以添加与特定杂志相关的新问题实体?
当我在控制器中创建一个表单,从表单类中调用它来添加一个问题时,我如何为它的某些字段传递一个预先建立的值?
我知道这必须很容易,但我被困在这里。
【问题讨论】:
我将两个相关实体关联起来:Magazine 和 Issue 与 OneToMany 关系。 如何创建表单以添加与特定杂志相关的新问题实体?
当我在控制器中创建一个表单,从表单类中调用它来添加一个问题时,我如何为它的某些字段传递一个预先建立的值?
我知道这必须很容易,但我被困在这里。
【问题讨论】:
您有多种选择:
您可以在 FormType 中添加一个隐藏字段并传递例如Magazine ID 这样。您可以结帐this tutorial 为例。
在您的FormType 中,它应该看起来像这样:
$builder->add('magazine', 'entity' /*, more options... */);
在你的Controller:
$magazine = // get Your magazine here...
$issue = new Issue();
$issue->setMagazine($magazine);
$form = $this->createForm(new YourFormType(), $issue);
您可以简单地生成这样的路线:/magazines/{magazine_id}/issues/add
这将在您的 Controller Action 中为您提供 Magazine 实体,如下所示:
public function addAction($magazineId)
{
$magazine = // get by $magazineId
// generate your issue form and stuff
if ($form->isValid()) {
$issue->setMagazine($magazine);
}
}
你可以从那里开始工作。
【讨论】:
如果您想将 Magazine 实体绑定到新的 Issue 实体,您必须添加 表单中具有实体类型的字段(使用 formBuilder)。
$builder->add('magazine', 'entity', array(
'class' => 'AcmeBundle:Magazine',
'property' => 'title'));
【讨论】:
您可以通过两种不同的方式来解决您的问题。
1 - 路线:您是否设置了不同的路线来向每本杂志添加问题?
在您的控制器中,您可以执行以下操作:
if ($form->isValid()) {
...
$magazine = $this->getManager()
->getRepository('AcmeBundle:Magazine')
->findOneBy($magazineId); // /{magazineId}/issue/new
...
$issue->setMagazine($magazine);
$em->persist($issue);
...
}
您还可以阅读route parameters 的文档。
2 - Single Form:如果在同一路由中添加新问题/issue/new
将Issue 字段添加到$formBuilder 时,添加一个下拉列表以指定Magazine
$builder->add('magazine', 'entity', array(
'class' => 'BundleNamespace:Magazine',
//If your class does not have a __toString() method add below
'property' => 'title',
));
【讨论】: