Heim  >  Fragen und Antworten  >  Hauptteil

Erstellen Sie eine neue Instanz eines Entitätsobjekts, das nicht dem formalen Ergebnis entspricht – Symfony 5

Ich habe drei Einheiten. „Bordereau“, „Stagiaire“, „BordereauStagiaire“.

Ich habe ein mehrstufiges Formular erstellt, in dem ich ein neues Bordereau erstelle und dem Benutzer die ausgewählten „Stigiaires“ zeigen und es dann validieren muss. Sowohl Bordereau als auch Stagiaire sind über die Tabelle BordereauStagiaire miteinander verbunden.

Ich habe es geschafft, die Bordereau- und Stagiaire-IDs über das neue Bordereau-Formular in den Controller zu bekommen. Aber ich suche nach einer Möglichkeit, ein neues BordereauStagiaire zu erstellen, wenn ein neues Bordereau erstellt wird.

Dies ist die Methode, mit deren Umsetzung ich begonnen habe. Im Backend wird zuerst das Bordereau erstellt, dann wird die BS mit dem neuen Bordereau und den ausgewählten Stagiaires erstellt. Die BS-Tabelle enthält die Bordereau-ID, die Stagiaire-ID und den Betrag (ein weiteres Attribut).

Wie erstelle ich einen neuen BordereauStagiaire mit der ID des Bordereau und der ID des Stagiaires, die ich aus dem Formular erhalten habe?

Das ist mein Controller

#[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,
        ]);
    }

Das habe ich aus dem Formular erhalten php $form['stagiaire']->getData()[0]->getId() 和 bordereau 获取数据的方式,我在持久化后获取其 id刷新到数据库中。 php $formBordereau->getId()

P粉004287665P粉004287665426 Tage vor543

Antworte allen(1)Ich werde antworten

  • 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();

    Antwort
    0
  • StornierenAntwort