Liaison ManyToMany avec table associée, récupérer la collection

Par bingoWRFC, il y a 1 an


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 je fait 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

3 réponses

bingoWRFC, il y a 1 an

Je me répond

Il faut une querybuilder pour recuperer les infos

dans UsersRepository.php

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

dans UsersController.php

$devices = $repository->getDevicesFromUser($userId);
Grafikart, il y a 1 an

En fait je ne comprends pas trop ce que tu as écrit

$User->getDevices($userId);

Pourquoi un U majuscule et pourquoi passer un paramètre à getDevices() car il n'y en a pas dans la déclaration de ta fonction.

bingoWRFC, il y a 1 an

Merci

Le U est un typo lors de la copy sur le site
Je n'avais pas vu le souci du parametre, comme il peut y avoir plusieurs devices il faut donc passer par un boucle pour les afficher
Avec la querybuiler j'arrive aussi résultat mais elle n'est pas necessaire

Résolu
Merci pour l'aide