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