我有三個實體。 “Bordereau”、“Stagiaire”、“BordereauStagiaire”。
我創(chuàng)建了一個多步驟表單,在其中創(chuàng)建一個新的 Bordereau,我需要向用戶顯示選定的“Stigiaires”,然后驗證它。 Bordereau 和 Stagiaire 均通過表 BordereauStagiaire 鏈接。
我設(shè)法通過新的 Bordereau 形式在控制器中獲取了 Bordereau 和 Stagiaire id。但我正在尋找一種在創(chuàng)建新的 Bordereau 時創(chuàng)建新的 BordereauStagiaire 的方法。
這是我已經(jīng)開始實施的方法。后端,將首先創(chuàng)建 Bordereau,然后將使用新的 Bordereau 和選定的 stagiaires 創(chuàng)建 BS。BS 表具有 Bordereau id、Stagiaire id 和 amount(另一個屬性)。
如何使用 Bordereau 的 ID 和我從表單中獲得的 Stagiaires 的 ID 創(chuàng)建一個新的 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 獲取數(shù)據(jù)的方式,我在持久化后獲取其 id刷新到數(shù)據(jù)庫中。 php $formBordereau->getId()
我寫的是一個答案,但它更像是一條包含大量文字的評論。
首先,我建議您僅使用英文命名變量,至少避免使用 bordereau
來命名諸如 create
之類的操作名稱。
然后,為您將使用的變量命名:$formBordereau
不是表單,它是一個實體,您應(yīng)該只使用 $bordereau
。
那么,您需要這個實體 BordereauStagiaire
嗎?我知道這是一個 ManyToMany
關(guān)系,Symfony 和 Doctrine 直接通過實體管理它,你不需要這個第三個實體。
Doctrine 是一個 ORM,這意味著您只能使用對象而不是 ID,如果您正確設(shè)計關(guān)系,您的 Bordereau
實體中應(yīng)該有一個方法 addStagiaire
,反之亦然。
然后您應(yīng)該使用以下對象調(diào)用此方法:
// 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();