建立一個不符合形式結果的實體物件的新實例 - Symfony 5
P粉004287665
P粉004287665 2023-09-12 18:34:54
0
1
576

我有三個實體。 「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粉004287665
P粉004287665

全部回覆(1)
P粉771233336

我寫的是一個答案,但它更像是一條包含大量文字的評論。

首先,我建議您僅使用英文命名變量,至少避免使用 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();
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板