Mysql 如何在条令查询生成器中改进/重写此查询(不在随子查询中)
我有一个非常简单的原始SQL查询,它可以按照我的要求工作: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
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