在Symfony2上添加与另一个特定的实体相关的新实体

时间:2014-08-07 11:56:16

标签: php symfony doctrine

我有两个相关的实体:杂志和OneToMany关系的问题。 如何创建表单以添加与特定杂志相关的新问题实体?

当我在控制器中创建一个表单时,从表单类中调用它来添加一个Issue,如何为它的某些字段传递一个预先建立的值?

我知道这一定很容易,但我被困在这里。

3 个答案:

答案 0 :(得分:1)

您有多种选择:

隐藏字段:

您可以向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);
    }
}

你可以从那里开始工作。

答案 1 :(得分:0)

您可以通过两种不同的方式解决问题。

1 - 路线:您是否为每个杂志设置了不同的路线?

在您的控制器中,您可以执行以下操作:

if ($form->isValid()) {
    ...
    $magazine = $this->getManager()
                     ->getRepository('AcmeBundle:Magazine')
                     ->findOneBy($magazineId); // /{magazineId}/issue/new
    ...
    $issue->setMagazine($magazine);
    $em->persist($issue);
    ...
}

您也可以阅读route parameters的文档。

2 - 单一表单:如果您在同一路线中添加新问题/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',
));

答案 2 :(得分:0)

如果要将Magazine实体绑定到新的Issue实体,则必须添加 表单中包含实体类型的字段(使用formBuilder)。

$builder->add('magazine', 'entity', array(
'class' => 'AcmeBundle:Magazine',
'property' => 'title'));

请参阅doc about entity field in form