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 erhaltenphp $form['stagiaire']->getData()[0]->getId()
和 bordereau 获取数据的方式,我在持久化后获取其 id刷新到数据库中。php $formBordereau->getId()
我写的是一个答案,但它更像是一条包含大量文字的评论。
首先,我建议您仅使用英文命名变量,至少避免使用
bordereau
来命名诸如create
之类的操作名称。然后,为您将使用的变量命名:
$formBordereau
不是表单,它是一个实体,您应该只使用$bordereau
。那么,您需要这个实体
BordereauStagiaire
吗?我知道这是一个ManyToMany
关系,Symfony 和 Doctrine 直接通过实体管理它,你不需要这个第三个实体。Doctrine 是一个 ORM,这意味着您只能使用对象而不是 ID,如果您正确设计关系,您的
Bordereau
实体中应该有一个方法addStagiaire
,反之亦然。然后您应该使用以下对象调用此方法: