IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Symfony 4 - Afficher une entité liée en OneToMany


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2016
    Messages : 18
    Par défaut Symfony 4 - Afficher une entité liée en OneToMany
    Bonjour à tous , je suis débutant et je dois développer une appli web permettant d'effectuer des recherches sur une base de consultants.

    Voici mon schéma de modelisation des données que j'ai simplifié en 3 entités / tables :
    Nom : easy.PNG
Affichages : 1418
Taille : 32,0 Ko

    La table Answer correspond aux réponses données par les consultants depuis un googleForm.

    La table Skill regroupe les compétences liées à un consultant.

    Entre les deux , j'ai une table qui sert de jointure ,j'ai donc appelé cette entité "Jointure".

    Mon but final est de pouvoir filtrer les consultants ( via un bouton dropdown ) en fonction de leur compétences(skill=>label). Mais j'aimerais tout d'abord arriver à afficher les infos de tous les consultants ( son UserEmail et ses Skills ( propriété Label dans ma table Skill ).

    J'ai alors créer mes 3 entités , avec comme relation ManyToOne de Skill et Answer vers Jointure.
    Voici donc ma table Jointure après avoir fait la commande make:migration :
    Nom : jointure.PNG
Affichages : 1253
Taille : 6,5 Ko
    Ma table Skill ( même relation que ma table Answer vers jointure) :
    Nom : sk.PNG
Affichages : 1301
Taille : 10,9 Ko

    Je souhaite donc afficher dans un template twig {% for jointures in jointure %} , ma liste de consultants et leur skills , par exemple : toto@gmail.com , CSS , HTML .

    J'ai tenté un findAll() dans le controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    class HomeController extends AbstractController
    {
     
        /**
         * @var JointureRepository
         */
     
        public function __construct(JointureRepository $repository, ObjectManager $em)
        {
            $this->repository = $repository;
            $this->em = $em;
        }
     
        /**
         * @Route("/", name="home")
         */
        public function index()
        {
            $repository = $this->getDoctrine()->getRepository(Jointure::class);
            $jointure = $repository->findAll();
            $this->em->flush();
            dump($jointure);
     
            return $this->render('pages/home.html.twig', [
                'controller_name' => 'HomeController',
                'jointure' => $jointure,
            ]);
        }
    }
    Voici le résultat de mon dump, je n'accède pas aux propriétés de Skill et Answer..
    Nom : dump.PNG
Affichages : 1317
Taille : 19,9 Ko

    Pouvez-vous m'orienter vers la bonne pratique pour affiché des entités liées entre elle depuis un OneToMany svp ?
    Merci d'avance !

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Bonjour,

    Coté php , pour les récupérer tu peux mettre par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $jointure->skills->toArray(); // array de type key val  ou les val sont des objects de skills
    $jointure->answers->toArray();// array de type key val  ou les val sont des objects de answers
    Coté twig , je crois que tu peux mettre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     {% for jointure in jointures %}   
       {% for skill in skills.jointure %}  {{dump(skill)}}   {%endfor%}
    {%endfor%}

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2016
    Messages : 18
    Par défaut
    Bonjour MehrezLabidi, merci pour ton aide

    J'ai donc essayer ta méthode, voici l'ErrorException qui en découle :

    Notice: Trying to get property 'skills' of non-object

    sur la ligne : $jointure->skills->toArray();

    Je pense que vous avez besoin de voir mes entités afin de mieux comprendre, les voici :

    Entité Jointure (que j'ai un peu raccourci):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\JointureRepository")
     */
    class Jointure
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\OneToMany(targetEntity="App\Entity\Skill", mappedBy="jointure")
         */
        private $skills;
     
        /**
         * @ORM\OneToMany(targetEntity="App\Entity\Answer", mappedBy="jointure")
         */
        private $answers;
     
        public function __construct()
        {
            $this->skills = new ArrayCollection();
            $this->answers = new ArrayCollection();
        }
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        /**
         * @return Collection|Skill[]
         */
        public function getSkills(): Collection
        {
            return $this->skills;
        }
     
        public function addSkill(Skill $skill): self
        {
            if (!$this->skills->contains($skill)) {
                $this->skills[] = $skill;
                $skill->setJointure($this);
            }
     
            return $this;
        }
     
        public function removeSkill(Skill $skill): self
        {
            if ($this->skills->contains($skill)) {
                $this->skills->removeElement($skill);
                // set the owning side to null (unless already changed)
                if ($skill->getJointure() === $this) {
                    $skill->setJointure(null);
                }
            }
     
            return $this;
        }
     
        /**
         * @return Collection|Answer[]
         */
        public function getAnswers(): Collection
        {
            return $this->answers;
        }
    }
    Entité Skill :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\SkillRepository")
     */
    class Skill
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $label;
     
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Jointure", inversedBy="skills")
         * @ORM\JoinColumn(nullable=false)
         */
        private $jointure;
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getLabel(): ?string
        {
            return $this->label;
        }
     
        public function setLabel(string $label): self
        {
            $this->label = $label;
     
            return $this;
        }
     
        public function getJointure(): ?Jointure
        {
            return $this->jointure;
        }
     
        public function setJointure(?Jointure $jointure): self
        {
            $this->jointure = $jointure;
     
            return $this;
        }
    }
    Entité Answer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\AnswerRepository")
     */
    class Answer
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $UserEmail;
     
        /**
         * @ORM\Column(type="date")
         */
        private $Date;
     
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Jointure", inversedBy="answers")
         * @ORM\JoinColumn(nullable=false)
         */
        private $jointure;
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getUserEmail(): ?string
        {
            return $this->UserEmail;
        }
     
        public function setUserEmail(string $UserEmail): self
        {
            $this->UserEmail = $UserEmail;
     
            return $this;
        }
     
        public function getDate(): ?\DateTimeInterface
        {
            return $this->Date;
        }
     
        public function setDate(\DateTimeInterface $Date): self
        {
            $this->Date = $Date;
     
            return $this;
        }
     
        public function getJointure(): ?jointure
        {
            return $this->jointure;
        }
     
        public function setJointure(?jointure $jointure): self
        {
            $this->jointure = $jointure;
     
            return $this;
        }
    }
    Malgrès avoir créer une relation ManyToOne depuis ( Skill et Answer ) vers mon entité Jointure , voici à quoi correspond ma table Jointure ( absence de answer_id et skill_id ) mais je pense que ça ne devrait pas être le problème :
    Nom : jointure.PNG
Affichages : 1236
Taille : 6,5 Ko

    Par ailleurs , si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $skills = $repository->find(1)->getSkills();
    je récupère bien dans le foreach mes skills dans Twig mais je voulais savoir comment TOUS les récupérer..

Discussions similaires

  1. [3.x] order by d'un champ d'une entité liée
    Par Elianora la blanche dans le forum Symfony
    Réponses: 1
    Dernier message: 11/02/2017, 13h36
  2. [Débutant] Afficher une table liée dans un report (left join)
    Par DaCoolG dans le forum ASP.NET MVC
    Réponses: 0
    Dernier message: 11/06/2015, 16h33
  3. afficher une entité par clé entrangère
    Par khrikhech dans le forum Doctrine2
    Réponses: 1
    Dernier message: 08/05/2013, 13h00
  4. Réponses: 2
    Dernier message: 20/11/2009, 11h37
  5. masquer ou afficher une condition liée à une condition?
    Par secondechance dans le forum IHM
    Réponses: 2
    Dernier message: 14/11/2008, 20h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo