我想使用dql创建一个查询,该查询在sql中看起来像这样:
select
e.*
from
e
inner join (
select
uuid, max(locale) as locale
from
e
where
locale = 'nl_NL' or
locale = 'nl'
group by
uuid
) as e_ on e.uuid = e_.uuid and e.locale = e_.locale
我尝试使用QueryBuilder生成查询和子查询。我认为他们自己做正确的事,但我无法将它们结合在Join语句中。如果DQL可以使用,现在有人吗?我不能使用本机SQL,因为我想返回真实的对象,并且我不知道该查询是运行哪个对象(我只知道具有UUID和LOCALE属性的基类)。
$subQueryBuilder = $this->_em->createQueryBuilder();
$subQueryBuilder
->addSelect('e.uuid, max(e.locale) as locale')
->from($this->_entityName, 'e')
->where($subQueryBuilder->expr()->in('e.locale', $localeCriteria))
->groupBy('e.uuid');
$queryBuilder = $this->_em->createQueryBuilder();
$queryBuilder
->addSelect('e')
->from($this->_entityName, 'e')
->join('('.$subQueryBuilder.') as', 'e_')
->where('e.uuid = e_.uuid')
->andWhere('e.locale = e_.locale');
您不能在dql的FROM
子句中放置子查询。
我会假设您的PK是{uuid, locale}
,因为与您在IRC上进行了讨论。由于您的查询中也有两个不同的列,因此这可能会变得丑陋。您能做的就是将其放入WHERE
子句中:
select
e
from
MyEntity e
WHERE
e.uuid IN (
select
e2.uuid
from
MyEntity e2
where
e2.locale IN (:selectedLocales)
group by
e2.uuid
)
AND e.locale IN (
select
max(e3.locale) as locale
from
MyEntity e3
where
e3.locale IN (:selectedLocales)
group by
e3.uuid
)
请注意,我使用了与您绑定到:selectedLocales
的(非空的)位置阵列的比较。这是为了避免销毁查询缓存,如果您想与其他地区匹配。
,如果这样做没有真正的优势,我也不会建议使用查询构建器构建此功能,因为如果您动态地添加有条件的有条件,则可以使打破查询缓存变得更加简单(此外,涉及3个查询构建器!)