问题描述
我有一个相当简单的原始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()
;
但是我确实觉得这看起来太复杂了,不是很干净。为了学习,是否有办法以较少的less肿达到相同的结果?也许在单个查询中利用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表示形式。