【问题标题】:Adding new Entity related to another specific one on Symfony2在 Symfony2 上添加与另一个特定实体相关的新实体
【发布时间】:2025-12-07 19:05:02
【问题描述】:

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

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

我知道这必须很容易,但我被困在这里。

【问题讨论】:

    标签: php symfony doctrine


    【解决方案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);
        }
    }
    

    你可以从那里开始工作。

    【讨论】:

    • 谢谢,这解决了它,在调用表单之前我没有想过设置一些字段。
    【解决方案2】:

    如果您想将 Magazine 实体绑定到新的 Issue 实体,您必须添加 表单中具有实体类型的字段(使用 formBuilder)。

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

    请参阅doc about entity field in form

    【讨论】:

      【解决方案3】:

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

      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',
      ));
      

      【讨论】:

        最近更新 更多