Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] Problèmes de ManyToMany

    24 mars 2019 à 0:43:00

    Bonjour / Bonsoir,

    J'ai un problème de doctrine avec une relation ManyToMany. Basiquement, j'ai une entity User qui a une relation OneToMany vers une entity Journey qui a une relation ManyToMany vers l'entity Fly. J'ai donc créer un jeu de données, cependant, impossible d'accéder aux vols liés à un voyage et inversement. La table d'association est bien créée et les données sont bien présente.

    Plus précisement, j'appelle tous les journeys liés à un User que j'affiche sur une vue grâce à un dump mais rien n'apparait.

    Entity Journey

    <?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\JourneyRepository")
     */
    class Journey
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="journeys")
         * @ORM\JoinColumn(nullable=false)
         */
        private $Owner;
    
        /**
         * @ORM\ManyToMany(targetEntity="App\Entity\Fly", inversedBy="journeys")
         */
        private $flies;
    
        ...
    } 

    Entity Fly

    <?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\FlyRepository")
     */
    class Fly
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="datetime")
         */
        private $hourStart;
    
        /**
         * @ORM\Column(type="datetime")
         */
        private $hourEnd;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Trip", inversedBy="flies")
         * @ORM\JoinColumn(nullable=false)
         */
        private $tripUsed;
    
        /**
         * @ORM\ManyToMany(targetEntity="App\Entity\Journey", mappedBy="flies")
         */
        private $journeys;
        
        ...
    }

    Controller

    <?php
    
    namespace App\Controller;
    
    use App\Entity\Fly;
    use function Sodium\add;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use App\Entity\User;
    use Symfony\Component\Routing\Annotation\Route;
    
    class ReservedFliesController extends AbstractController
    {
        /**
         * @Route("/reserved_flies", name="reserved_flies")
         */
        public function index()
        {
            $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
            $user = $this->getUser();
            $journeys = $user->getJourneys();
            return $this->render('reserved_flies/index.html.twig', [
                'controller_name' => 'ReservedFliesController',
                'journeys' => $journeys
            ]);
        }
    }
    

    Rendu de la vue

    Merci d'avance pour vos réponses,

    si vous avez besoin de plus de renseignements n'hésitez pas.


    • Partager sur Facebook
    • Partager sur Twitter
      24 mars 2019 à 9:19:33

      Bonjour,

      Attention le dump dans un controller ne va pas chercher toute l'arborescence.

      Pour tester l'arboresecence, n'hésite pas à créer une vue essai et à faire sur un user qui a bien le vol et les voyages dont tu connais les id.

      A toi

      • Partager sur Facebook
      • Partager sur Twitter
        24 mars 2019 à 20:04:06

        Bonjour. 

        Le piège souvent est la relation manu bi directionnelle ou pas.

        Après tu peux faire une requête pour aller chercher les journeys qui ont pour user_id ton user courant.

        A plus. 

        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui aime à apprendre est bien près du savoir " Confucius

          24 mars 2019 à 20:56:18

          Merci pour vos réponse CarréDas1 et stoads

          D'accord pour le dump, j'essaye ça et je tiens au courant

          Oui j'ai cru comprendre, mais dans quel cas utiliser le bi ou l'unidirectionnel ?

          Le problème n'est pas la récupération des journeys mais des flies liés à ceux-ci.



          -
          Edité par BaptisteDéporté 24 mars 2019 à 21:00:10

          • Partager sur Facebook
          • Partager sur Twitter
            24 mars 2019 à 21:10:53

            Je vais essayer d'être le plus clair possible pour répondre à ta question sur le bi directionnel.

            Admettons qu'un utilisateur puisse ajouter un vol et qu'à partir d'un vol tu puisses ajouter un utilisateur dans ce cas tu utiliseras le bi directionnel. Par contre si tu associe un utilisateur a un vol mais jamais dans lautre sens lunidirectionel suffit. Donc c'est toi qui décide en fonction des besoins "metier".

            Maintenant pour récupérer les flies simple ;-) tu as une relation entre journeys et flies. Donc un join te permettra de récupérer les flies puis un where journey.owner = :user. 

            J'espère avoir répondu à toutes tes questions. 

            À +

            • Partager sur Facebook
            • Partager sur Twitter

            Celui qui aime à apprendre est bien près du savoir " Confucius

            [Symfony] Problèmes de ManyToMany

            × 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