首页  >  问答  >  正文

创建一个不符合形式结果的实体对象的新实例 - Symfony 5

我有三个实体。 “Bordereau”、“Stagiaire”、“BordereauStagiaire”。

我创建了一个多步骤表单,在其中创建一个新的 Bordereau,我需要向用户显示选定的“Stigiaires”,然后验证它。 Bordereau 和 Stagiaire 均通过表 BordereauStagiaire 链接。

我设法通过新的 Bordereau 形式在控制器中获取了 Bordereau 和 Stagiaire id。但我正在寻找一种在创建新的 Bordereau 时创建新的 BordereauStagiaire 的方法。

这是我已经开始实施的方法。后端,将首先创建 Bordereau,然后将使用新的 Bordereau 和选定的 stagiaires 创建 BS。BS 表具有 Bordereau id、Stagiaire id 和 amount(另一个属性)。

如何使用 Bordereau 的 ID 和我从表单中获得的 Stagiaires 的 ID 创建一个新的 BordereauStagiaire?

这是我的控制器

#[Route('/create/bordereau', name: 'app_bordereau_create', methods: ['GET','POST'])]
    public function createBordereauAction(CreateBordereauFlow $flow, PersistenceManagerRegistry $doctrine)
    {
        $formBordereau = new Bordereau();
        $formBordStag = new BordereauStagiaire();

        $formBordereau->setUser($this->getUser());

        $flow->bind($formBordereau);

        $form = $flow->createForm();
        
        if ($flow->isValid($form)) {
            $flow->getCurrentStepNumber($form);
            $flow->saveCurrentStepData($form);
            if ($flow->nextStep()) {
                $form = $flow->createForm();
                $flow->getCurrentStepNumber($form);
                $flow->saveCurrentStepData($form);
                // dd($form['stagiaire']->getData()[0]->getId());
                // dd($form->getData());
                
            } else{
                
                $entityManager = $doctrine->getManager();
                $entityManager->persist($formBordereau);
                $entityManager->flush();
                // dd($formBordereau->getId());
                return $this->redirectToRoute('app_bordereau_index');
                
            }
        }

        // if ($flow->redirectAfterSubmit($form)) {
        //     // $request = $this->getRequest();
        //     $params = $this->formFlowUtil->addRouteParameters(array_merge($request->query->all(),
        //             $request->attributes->get('_route_params')), $flow);
    
        //     return $this->redirectToRoute($request->attributes->get('_route'), $params);
        // }

        return $this->render('bordereau/create_bordereau.html.twig', [
            'form' => $form->createView(),
            'flow' => $flow,
            'formBordereau' =>$formBordereau,
        ]);
    }

这是我从表单 php $form['stagiaire']->getData()[0]->getId() 和 bordereau 获取数据的方式,我在持久化后获取其 id刷新到数据库中。 php $formBordereau->getId()

P粉004287665P粉004287665426 天前544

全部回复(1)我来回复

  • P粉771233336

    P粉7712333362023-09-13 09:55:02

    我写的是一个答案,但它更像是一条包含大量文字的评论。

    首先,我建议您仅使用英文命名变量,至少避免使用 bordereau 来命名诸如 create 之类的操作名称。

    然后,为您将使用的变量命名:$formBordereau 不是表单,它是一个实体,您应该只使用 $bordereau

    那么,您需要这个实体 BordereauStagiaire 吗?我知道这是一个 ManyToMany 关系,Symfony 和 Doctrine 直接通过实体管理它,你不需要这个第三个实体。

    Doctrine 是一个 ORM,这意味着您只能使用对象而不是 ID,如果您正确设计关系,您的 Bordereau 实体中应该有一个方法 addStagiaire ,反之亦然。

    然后您应该使用以下对象调用此方法:

    // I am not sure here, does it return a Stagiaire Entity ? 
    // I don't understand your flow form
    $stagiaire = $form['stagiaire']->getData()[0];
    
    $entityManager->persist($bordereau);
    $bordereau->addStagiaire($stagiaire);
    $entityManager->flush();

    回复
    0
  • 取消回复