Bonjour

J'ai deux tables users et devices. chaques users peut avoir plusieurs devices et chaque devices peut avoir plusieurs users. j'ai donc fait ne relation ManyToMany

Table users

    /**
     * @var Collection<int, Users>
     */
    #[ORM\ManyToMany(targetEntity: Users::class, mappedBy: 'devices')]
    #[ORM\JoinTable(name:"users_devices")]
    private Collection $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
    }
......
    /**
     * @return Collection<int, Users>
     */
    public function getUsers(): Collection
    {
        return $this->users;
    }

    public function addUser(Users $user): static
    {
        if (!$this->users->contains($user)) {
            $this->users->add($user);
            $user->addDevice($this);
        }

        return $this;
    }

    public function removeUser(Users $user): static
    {
        if ($this->users->removeElement($user)) {
            $user->removeDevice($this);
        }

        return $this;
    }

Table devices

     /**
     * @var Collection<int, Devices>
     */
    #[ORM\ManyToMany(targetEntity: Devices::class, inversedBy: 'users')]    
    private Collection $devices;

    public function __construct()
    {
        $this->devices = new ArrayCollection();
    }
......
  /**
     * @return Collection<int, Devices>
     */
    public function getDevices(): Collection
    {
        return $this->devices;
    }

    public function addDevice(Devices $device): static
    {
        if (!$this->devices->contains($device)) {
            $this->devices->add($device);
        }

        return $this;
    }

    public function removeDevice(Devices $device): static
    {
        $this->devices->removeElement($device);

        return $this;
    }

Lors de la migration une table de jointure users_devices
Le fonctionement est correcte lorsque que fais des insertions

Par contre je n'arrive pas à récupérer les devices pour un user
Par SQL la jointure me donne bien les infos

SELECT u.id,u.name,d.id,d.name FROM `users`AS u
JOIN user_device AS j ON j.userid = u.id
JOIN devices AS d ON j.deviceid = d.id
WHERE u.id = 1;

Voici la fonction dans mon UsersController pour recurpérer les devices

#[Route('/users/{id}', name: 'users.show', methods: ['GET'])]
    public function show(
        Users $user, 
        EntityManagerInterface $entityManager
    ): Response {
        $userId = $User->getId();
        $devices = $User->getDevices($userId);
        dd($devices);

        return $this->render('users/show.html.twig', [
            'user' => $User,
        ]);
    }

Le retour est une collection vide

Doctrine\ORM\PersistentCollection {#697 ▼
  #collection: 
Doctrine\Common\Collections
\
ArrayCollection
 {#684 ▼
    -elements: []
  }
  #initialized: false
  -snapshot: []
  -owner: 
App\Entity
\

Comment arriver à récupérer les infos
Merci

1 réponse


Je me répond

Il faut une querybuilder pour recuperer les infos

dans UsersRepository.php

    public function getDevicesFromUser(): array
    {
         return $this->createQuerybuilder('user')
            ->select('user','devices',)
            ->leftjoin('user.devices', 'devices')
            ->getQuery()
            ->getResult()
        ;
    }

dans UsersController.php

$devices = $repository->getDevicesFromUser();