如何在Doctrine查询生成器中改进/重写此查询不能与子查询一起使用

问题描述

我有一个相当简单的原始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)

现在,我尝试在“ Doctrine查询生成器”中获得相同的结果集。 我建立了这样的东西,也可以工作,并且给我正确的结果

$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()
        ;

但是我确实觉得这看起来太复杂了,不是很干净。为了学习,是否有办法以较少的les​​s肿达到相同的结果?也许在单个查询中利用JOIN-s的东西?有时候,除了涉及简单的包含条件之外,我根本无法全神贯注地将结果加入DQL / Builder中。

解决方法

将“相当简单的原始SQL查询转换为我想要的”

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

然后构建此查询的DQL表示形式。