Mysql 如何在条令查询生成器中改进/重写此查询(不在随子查询中)

Mysql 如何在条令查询生成器中改进/重写此查询(不在随子查询中),mysql,doctrine,dql,Mysql,Doctrine,Dql,我有一个非常简单的原始SQL查询,它可以按照我的要求工作: SELECT * FROM set WHERE set.is_finalized = 1 AND set.id NOT IN (SELECT set_completion.set_id FROM set_completion WHERE set_completion.user_id = 2) 现在,我尝试在条令查询生成器中获得相同的结果集。 我构建了类似这样的东西,它也可以工作,并给出正确的结果: $subQuery = $th

我有一个非常简单的原始SQL查询,它可以按照我的要求工作:

SELECT * FROM set 
WHERE set.is_finalized = 1 
AND set.id NOT IN 
(SELECT set_completion.set_id FROM set_completion WHERE set_completion.user_id = 2)
现在,我尝试在条令查询生成器中获得相同的结果集。 我构建了类似这样的东西,它也可以工作,并给出正确的结果

$subQuery = $this->_em->createQueryBuilder();
$subQueryResult = $subQuery
            ->select('IDENTITY(c.set)')
            ->from('App\Entity\SetCompletion', 'c')
            ->where('c.user = :user')
            ->setParameter('user', $user)
            ->getQuery()
            ->getArrayResult()
        ;
        
return $this->createQueryBuilder('s')
            ->andWhere('s.isFinalized = :finalized')
            ->andWhere('s.id not in (:completions)')
            ->setParameter('finalized', true)
            ->setParameter('completions', $subQueryResult)
            ->orderBy('s.id', 'DESC')
            ->getQuery()
            ->getResult()
        ;
但我确实觉得这看起来过于复杂,不太干净。为了学习,有没有办法用不那么臃肿的东西达到同样的效果?也许在单个查询中使用了JOIN-s?有时,当涉及到一些不只是简单的包含条件的问题时,我根本无法在DQL/Builder中连接结果。

将您的“非常简单的原始SQL查询”转换为

然后构建此查询的DQL表示

SELECT set.* 
FROM set 
LEFT JOIN set_completion ON set.id = set_completion.set_id
                        AND set_completion.user_id = 2
WHERE set.is_finalized = 1 
  AND set_completion.set_id IS NULL