Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème ManyToMAny sur formulaire

Method App\Entity\Document::__toString() must return a string value

    24 septembre 2021 à 10:50:20

    Bonjour à tous,

     Je me permets de vous demander une aide concernant un problème :

    J’ai un formulaire qui enregistre des infos sur plusieurs éléments de la table « Document »

    Le formulaire possède les champs : nom (title), date (doc_at), lieu (location en ManyToMany) et service (Service en ManyToMany)

    Lorsque je valide le formulaire avec le lieu ça baigne mais lorsque je valide avec le service, ça renvoie une erreur : « Method App\Entity\Document::__toString() must return a string value »

    Je me rends compte que dans la classe Document, la relation avec Service est « mappedBy » alors que pour la relation avec Service, c’est « inversedBy » ;

    Du coup, je demande comment faire pour pouvoir enregistrer les services choisis dans la jointure (service_id-document_d).

     Merci d’avance pour vos conseils

    Class Document (extrait) :

      class Document
    {
      private $location;
    
        /**
         * @ORM\ManyToOne(targetEntity=Service::class, inversedBy="documentreferent")
         * @Groups({"read:Document:collection"})
         */
    
        /**
         * @ORM\ManyToMany(targetEntity=Service::class, mappedBy="document")
         * @Groups({"read:Document:item"})
         */
        private $services;
    
        /**
         * @return Collection|Service[]
         */
        public function getServices(): Collection
        {
            return $this->services;
        }
    
    /**
         * @return Collection|Location[]
         */
        public function getLocation(): Collection
        {
            return $this->location;
        }
    
        public function addLocation(Location $location): self
        {
            if (!$this->location->contains($location)) {
                $this->location[] = $location;
            }
    
            return $this;
        }
    
    
        public function addService(Service $service): self
        {
            if (!$this->services->contains($service)) {
                $this->services[] = $service;
                $service->addDocument($this);
            }
    
    
    
    }
    



    Controller (extrait) :

       public function modifierDocument($id=null, NewsRepository $newsRepo, ServiceRepository $serviceRepo, DocumentRepository $docuRepo, Request $request)
          {
         //   $newsDocs = $docuRepo->findOneBy(['id' =>197]);
            $newsDocs = $docuRepo-> documentArticleDateLess($id);
            $news = $newsRepo->findOneBy(['id' => $id]);
            $dateNews = $news->getCreatedAt();
          //formulaire nom et date identique
                $formSameName = $this->createForm(DocumentSameNameType ::class);
                       $formSameName ->handleRequest($request);  
                       if($formSameName->isSubmitted() && $formSameName->isValid()) {
            $docTitle = $formSameName->get('title')->getData();
            $docServices = $formSameName->get('services')->getData();
              $doclieux = $formSameName->get('location')->getData();
            $docDate = $formSameName->get('doc_at')->getData();
    foreach($newsDocs as $newsDoc) {
                           $newsDoc->setTitle($docTitle);
                          $newsDoc->setDocAt($docDate);
                        foreach($doclieux as $lieu) {                  
                            $newsDoc->addLocation($lieu);
               }
                        foreach($docServices as $docService) {
                        $newsDoc->addService($docService);
                        }
                  }
    



    -
    Edité par AlexandreBERTRAND5 24 septembre 2021 à 10:52:11

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2021 à 11:30:28

      Salut

      mappedBy et inversedBy servent à déterminer quel côté de la relation est le propriétaire. Si ce n'est pas complètement anodin dans le cas d'une relation ManyToMany, cela n'a à mon avis que peu à voir avec ton erreur, qui indique simplement que pour les documents existants, tu sembles vouloir les afficher à un moment ou un autre, ou alors le formulaire comporte un champ qui tente de faire s'afficher le document. Comme l'objet n'a apparemment pas de représentation sous forme de chaîne de caractères, PHP lance cette erreur.

      Je te propose de faire comme le dit le message d'erreur : implémente __toString() dans l'entité Document, et fait en sorte qu'elle retourne par exemple le nom du fichier, ce sera déjà un point de débloqué.

      • Partager sur Facebook
      • Partager sur Twitter
        24 septembre 2021 à 11:44:02

        Hello,

        Merci pour ta réponse mais __string est bien présent dans la classe Document et aussi sur la classe service.

        Concernant la relation propriétaire, quand je valide les lieux je boucle pour chaque document pour enregistrer les lieux :

        foreach($doclieux as $lieu) {  $newsDoc->addLocation($lieu);
        }

        Pour Service, idem,  je boucle pour chaque document pour enregistrer chaque service :

                            foreach($docServices as $docService) {
                            $newsDoc->addService($docService);
                            }

        Mais, étant donné que "Service" est du côté propriétaire et document est inversé je me demande si la ccommande : " $newsDoc (liste des news)->addService($docService(service choisi));" est correct ?

        (pour location, c'est "document le propriétaire)


        -
        Edité par AlexandreBERTRAND5 24 septembre 2021 à 11:45:19

        • Partager sur Facebook
        • Partager sur Twitter
          24 septembre 2021 à 17:15:08

          Si tes mappings sont bien faits et que les méthodes y afférentes le sont aussi, tu ne devrais pas avoir à faire de boucle explicitement pour ajouter les emplacements et les services aux documents.

          Maintenant, j'ai mal lu le message d'erreur : il t'est dit que la méthode __toString() doit retourner une chaîne de caractères. Probablement que là, tu utilises les objets Service ou/et Location, et qu'au moins l'un des deux n'a pas de __toString(). A voir si implémenter cette méthode dans l(es) objet(s) où elle(s) manque(nt) suffit à ton besoin, ou si tu dois spécifier la propriété à utiliser directement dans Document::__toString().

          • Partager sur Facebook
          • Partager sur Twitter

          Problème ManyToMAny sur formulaire

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown