Créer une nouvelle instance d'un objet entité non conforme au résultat formel - Symfony 5
P粉004287665
P粉004287665 2023-09-12 18:34:54
0
1
556

J'ai trois entités. "Bordereau", "Stagiaire", "BordereauStagiaire".

J'ai créé un formulaire en plusieurs étapes où je crée un nouveau Bordereau et je dois montrer à l'utilisateur les "Stigiaires" sélectionnés puis le valider. Bordereau et Stagiaire sont liés via la table BordereauStagiaire.

J'ai réussi à récupérer les identifiants Bordereau et Stagiaire dans le contrôleur via le nouveau formulaire Bordereau. Mais je cherche un moyen de créer un nouveau BordereauStagiaire lorsqu'un nouveau Bordereau est créé.

C'est la méthode que j'ai commencé à mettre en œuvre. Backend, le Bordereau sera créé en premier, puis le BS sera créé avec le nouveau Bordereau et les stagiaires sélectionnés. La table BS a l'identifiant Bordereau, l'identifiant Stagiaire et le montant (un autre attribut).

Comment créer un nouveau BordereauStagiaire en utilisant l'ID du Bordereau et l'ID des Stagiaires que j'ai obtenu du formulaire ?

C'est mon contrôleur

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

Voici ce que j'ai obtenu du formulaire php $form['stagiaire']->getData()[0]->getId() 和 bordereau 获取数据的方式,我在持久化后获取其 id刷新到数据库中。 php $formBordereau->getId()

P粉004287665
P粉004287665

répondre à tous(1)
P粉771233336

Ce que j'ai écrit était une réponse, mais c'était plutôt un commentaire avec beaucoup de texte.

Tout d'abord, je vous recommande d'utiliser uniquement des variables nommées en anglais, évitez au moins d'utiliser des noms d'opération comme bordereau 来命名诸如 create .

Donnez ensuite un nom à la variable que vous utiliserez : $formBordereau 不是表单,它是一个实体,您应该只使用 $bordereau.

Eh bien, vous avez besoin de cette entité BordereauStagiaire 吗?我知道这是一个 ManyToMany relation, Symfony et Doctrine la gèrent directement via des entités, vous n'avez pas besoin de cette troisième entité.

Doctrine est un ORM, ce qui signifie que vous ne pouvez travailler avec des objets, pas des identifiants, que si vous concevez correctement les relations, votre Bordereau 实体中应该有一个方法 addStagiaire et vice versa.

Vous devez alors appeler cette méthode avec l'objet suivant :

// 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();
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal