Bonjour,
Je tente de récupérer un utilisateur (user Entity) pour lequel aucune action (Action Entity) n'a été enregistrée.
Pour cela, j'utilise l'expression not exists de Doctrine.
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 <?php namespace App\Repository; use App\Entity\User; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Symfony\Bridge\Doctrine\RegistryInterface; /** * @method User|null find($id, $lockMode = null, $lockVersion = null) * @method User|null findOneBy(array $criteria, array $orderBy = null) * @method User[] findAll() * @method User[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ class UserRepository extends ServiceEntityRepository { public function __construct(RegistryInterface $registry) { parent::__construct($registry, User::class); } /** * @return User[] Returns an array of User objects */ public function findByCriteres($reqsearch = null) { $qb = $this->createQueryBuilder('u'); //Je crée une sous-requête $sub = $this->createQueryBuilder('a'); $sub = $sub->innerJoin('a.actions', 'act'); $qb->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL()))); return $qb->getQuery()->getResult(); }
En faisant des dump pour visualiser les résultats, j'ai 2 occurrences dans mon entité User :
et 1 seule dans mon entité Action :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 array:2 [▼ 0 => User {#670 ▶} 1 => User {#3280 ▶} ]
Je devrais donc obtenir comme résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 array:1 [▼ 0 => User {#3280 ▶} ]
Or je n'obtiens qu'un résultat vide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 array:1 [▼ 0 => User {#670 ▶} ]
En faisant un dump sur mon "getDQL", j'obtiens cette requête qui me semble bonne (je n'ai aucune erreur d'affichée) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part []
Code : Sélectionner tout - Visualiser dans une fenêtre à part "SELECT u FROM App\Entity\User u WHERE NOT(EXISTS(SELECT z FROM App\Entity\User z INNER JOIN z.actions act))"
Tout semble bon sauf mon résultat !
Merci de l'aide que vous pourrez m'apporter.
Partager