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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
array:2 [0 => User {#670 ▶}
  1 => User {#3280 ▶}
]
et 1 seule dans mon entité Action :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
array:1 [0 => 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 {#670 ▶}
]
Or je n'obtiens qu'un résultat vide

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
 "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.