Функция Doctrine "не существует" не работает - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь выбрать пользователя, которого нет в моей таблице действий.

<?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');

       //Create subquery
       $sub = $this->createQueryBuilder('a');
       $sub = $sub->innerJoin('a.actions', 'act');

        $qb->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())));

        return $qb->getQuery()->getResult();
   }

При выполнении дампа для просмотра результатов у меня есть 2 вхождения в моем объекте User:

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

И только один в моей сущности Action:

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

Поэтому я должен получить следующий результат:

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

Но я получаю только пустой результат:

[]

Делая дамп на моем "getDQL", я получаю этот запрос, который мне кажется хорошим (у меня не отображаются ошибки):

"SELECT u FROM App\Entity\User u WHERE NOT(EXISTS(SELECT z FROM App\Entity\User z INNER JOIN z.actions act))"

Все выглядит хорошо, кроме моего результата!

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 07 мая 2019

Вы забыли присоединиться к своим сетам User u и User z с их идентификаторами.

Ваш DQL должен быть:

SELECT u FROM App\Entity\User u WHERE 
    NOT(
       EXISTS(
           SELECT z FROM App\Entity\User z INNER JOIN z.actions act WHERE u.id = z.id
       )
    )

WHERE u.id = z.id отсутствует в вашем DQL

Так что вы должны вызывать функцию where в вашем подзапросе.


   /**
    * @return User[] Returns an array of User objects
    */
   public function findByCriteres($reqsearch = null)
   {
       $qb = $this->createQueryBuilder('u');

       //Create subquery
       $sub = $this->createQueryBuilder('z');
       $sub = $sub->innerJoin('z.actions', 'act')
                  ->where('z.id = u.id');

        $qb->andWhere($qb->expr()->not($qb->expr()->exists($sub->getDQL())));

        return $qb->getQuery()->getResult();
   }
...