Bonjour,

J'ai deux tables, une User et une autre lié one-to-one pour des détails de profiles.

Afin de modifier les infos dans la table lié je passe l'IDUser en paramêtre, seulement cela fonctionne que si une ligne est déjà présente dans la table lié pour update mais si c'est un insert j'ai cette erreur :

EntityManager#persist() expects parameter 1 to be an entity object, NULL given.

    /**
     * @Route("/{_locale}/profile/", name="profile")
     * @param UserSocial|null $userSocial
     * @param Request $request
     * @param ObjectManager $manager
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function index(UserSocial $UserSocial = null,Request $request, ObjectManager $manager)
    {
        if(!$UserSocial) {
            $UserSocial = new UserSocial();
        }

        $UserSocial = $this->getDoctrine()
            ->getRepository('App\Entity\UserSocial')
            ->findOneByUser($this->getUser());

        $form = $this->createForm(UserSocialType::class, $UserSocial);

        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){

            $manager->persist($UserSocial);
            $manager->flush();

            return $this->redirectToRoute('profile');
        }

        return $this->render('profile/index.html.twig', [
            'form' => $form->createView()
        ]);
    }

une idée ?
Merci

9 réponses


Digivia
Réponse acceptée

Le problème est que tu vas chercher l'entité UserSocial... Mais si elle n'existe pas, elle a une valeur null.
essaye plutôt :

if (null === $UserSocial) {
            $UserSocial = new UserSocial();
            // Ici tu initialises le User concerné par le profil à modifier... 
            // Tu pourrais aussi le faire après soumission du form, mais si jamais tu as besoin d'un EventListener dans ton form, tu auras le User dans ton entité UserSocial
            $UserSocial->setUser($this->getUser());
        } 

Donc soit tu passes une entité UserSocial (modification d'un profil), soit tu veux en créer un, et il faut que tu définisses la relation one-to-one avec User.
Et ce code est à supprimer :

// A supprimer :
        $UserSocial = $this->getDoctrine()
            ->getRepository('App\Entity\UserSocial')
            ->findOneByUser($this->getUser());
CVNeo
Auteur

En faite je me demande si il serait pas plus simple de passer l'id de l'user avant le persiste mais comment ?

if($form->isSubmitted() && $form->isValid()){

            //Du genre : 
            $UserSocial['IDUser'] = $IDUser;

            $manager->persist($UserSocial);
            $manager->flush();

            return $this->redirectToRoute('profile');
        }
CVNeo
Auteur

Ok merci pour l'explication cela fonctionne :)
Pas facile les débuts :)

C'est vrai qu'au début il faut s'habituer à manipuler les entités, mais ça va venir vite, tu verras. Et c'est tellement pratique qu'après tu te demanderas comment tu faisait avant :)

CVNeo
Auteur

Hum en fait du coup il m'affiche plus l'enregistrement existant lié dans le formulaire :(

CVNeo
Auteur

Je dois mal m'y prendre pour appeler les infos à entrée dans le formualire ?
J'ai du mal à comprendre comment gère les liaisons de tables ...

CVNeo
Auteur

En fait comment appler les data de la table lié via l'id de l'user connecté ?

Pour l'instant je le fait via un find :

        $UserSocial = $this->getDoctrine()
            ->getRepository('App\Entity\UserSocial')
            ->findOneByUser(1);

y a une autre méthode ?

Ok, j'ai compris ce que tu veux faire, ajoute ce code avant :

$UserSocial = $this->getDoctrine()
            ->getRepository('App\Entity\UserSocial')
            ->findOneByUser($this->getUser());

Puis :

if (null === $UserSocial) {
            $UserSocial = new UserSocial();
            $UserSocial->setUser($this->getUser());
        } 

Ainsi, tu commence à chercher si le profile user existe, sinon, tu l'initialise pour le créer au travers du form...

Tu avais la solution, mais pas dans le bon ordre ;)