Partage
  • Partager sur Facebook
  • Partager sur Twitter

Impossible de déterminer le type d'accès

    23 janvier 2020 à 22:59:53

    Bonjour,

    Voila je rencontre un petit problème avec mon code. Je veux créer une entité maitre nommée Users et une autre nommée Specialties.

    L'entité Users contient les propriétés et les fonctions suivantes:

    <?php
    
    namespace App\Entity;
    
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\AdvancedUserInterface;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Serializer\Annotation\Groups;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    /**
     * @ORM\Entity(repositoryClass="App\Repository\UsersRepository")
     * @UniqueEntity(
     *     fields={"email"},
     *     errorPath="email",
     *     message="It appears you have already registered with this email."
     * )
     */
    class Users implements UserInterface
    {
    
        /**
         * Users constructor.
         */
        public function __construct()
        {
            $this->created_at = new \DateTime();
            $this->specialtyId = new ArrayCollection();
        }
    
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         * @Groups({"public"})
         */
        private $id;
    
        //Other properties there...
    
        /**
         * @ORM\ManyToMany(targetEntity="App\Entity\Specialties", inversedBy="users")
         */
        private $specialtyId;
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        /**
         * @return Collection|Specialties[]
         */
        public function getSpecialtyId(): Collection
        {
            return $this->specialtyId;
        }
    
        public function addSpecialtyId(Specialties $specialtyId): self
        {
            if (!$this->specialtyId->contains($specialtyId)) {
                $this->specialtyId[] = $specialtyId;
            }
            return $this;
        }
    
        public function removeSpecialtyId(Specialties $specialtyId): self
        {
            if ($this->specialtyId->contains($specialtyId)) {
                $this->specialtyId->removeElement($specialtyId);
            }
            return $this;
        }
    
    }

    L'entité Specialties contient le code suivant:

    <?php
    
    namespace App\Entity;
    
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass="App\Repository\SpecialtiesRepository")
     */
    class Specialties
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        //Other properties there...
    
        /**
         * @ORM\ManyToMany(targetEntity="App\Entity\Users", mappedBy="specialtyId")
         */
        private $users;
    
        public function __construct()
        {
            $this->users = new ArrayCollection();
        }
    
        /**
         * @return Collection|Users[]
         */
        public function getUsers(): Collection
        {
            return $this->users;
        }
    
        public function addUser(Users $user): self
        {
            if (!$this->users->contains($user)) {
                $this->users[] = $user;
                $user->addSpecialtyId($this);
            }
    
            return $this;
        }
    
        public function removeUser(Users $user): self
        {
            if ($this->users->contains($user)) {
                $this->users->removeElement($user);
                $user->removeSpecialtyId($this);
            }
    
            return $this;
        }
    }

    Ces entités créent une troisième table nommé users_specialties avec les propriétés users_id et specialties_id.
    Je veux sauvegarder les informations liés à l'utilisateur sur la table users, ainsi que lier l'utilisateur à sa spécialité sur la table users_specialties.
    Un utilisateur peut avoir plusieurs spécialités.

    Malheureusement en essayant de créer l'utilisateur, j'obtiens cette erreur:
    "App\Entity\Users": The property "specialtyId" in class "App\Entity\Users" can be defined with the methods "addSpecialtyId()", "removeSpecialtyId()" but the new value must be an array or an instance of \Traversable, "App\Entity\Specialties" given.**

    Le message est pas mal expliquer, quand tu utilises les méthodes addSpecialtyId ou removeSpecialtyId() le type de retour de ces fonctions doivent être du type array ou \Traversable et toi tu lui envoies un App\Entity\Specialties

    Ce qu'il faut faire c'est que dans tes fonctions tu remplaces ta réponse de retour :

    public function addSpecialtyId(Specialties $specialtyId): self
        {
            if (!$this->specialtyId->contains($specialtyId)) {
                $this->specialtyId[] = $specialtyId;
            }
            return $this->specialtyId;
        }
    
        public function removeSpecialtyId(Specialties $specialtyId): self
        {
            if ($this->specialtyId->contains($specialtyId)) {
                $this->specialtyId->removeElement($specialtyId);
            }
            return $this->specialtyId;
        }

    Mais ça ne marche toujours pas quand j'essai d'enregistrer mon formulaire.



    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2020 à 0:56:49

      Bonsoir,

      Alors il y a plusieurs choses qui me perturbe: 

      • Le nommage de ta variable $specialityId? Pourquoi ? A ta place, je l'aurai simplement appelé specialities, et ta classe Specialities je l'aurai nommé Speciality. Si je dis pas de bêtise, ta classe Specialities représente une seul et unique spécialité, par contre un array ou une collection, représenterai plusieurs specialities, déjà au niveau du code, ça sera beaucoup plus parlant et dans le futur maintenable et éviter les confusions.
      • Dans tes fonctions addSpecialityId et removeSpecialityId, si tu regardes le prototype de tes fonctions, la valeur de retour est self, soit la classe. Je suppose que ces fonctions sont dans la class User, alors pourquoi tu return $this->specialityId qui est un ArrayCollection ? Il y a comme un petit problème là ?
      • Dernièrement, tu définis une relation Many-to-Many alors que tu dis, je cite: "Un utilisateur peut avoir plusieurs spécialités.". Pour moi c'est plutôt une relation One-to-Many... 

      Cordialement,

      -
      Edité par Awadanp 24 janvier 2020 à 0:57:36

      • Partager sur Facebook
      • Partager sur Twitter

      Impossible de déterminer le type d'accès

      × 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