Problème avec fonction Doctrine "not exists"

Default
,

Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

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.

<?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();
   }

Ce que je veux

En faisant des dump pour visualiser les résultats, j'ai 2 occurences dans mon entité User :

array:2 [▼
  0 => User {#670 ▶}
  1 => User {#3280 ▶}
]

et 1 seule dans mon entité Action :

array:1 [▼
  0 => User {#3280 ▶}
]

Je devrais donc obtenir comme résultat :

array:1 [▼
  0 => User {#670 ▶}
]

Ce que j'obtiens

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) :

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

1 Réponse

Default
,

La solution m'a été apporté...
Il manquait la clause where u.id = z.id dans mon DQL.

Sujet clos