gpt4 book ai didi

doctrine-orm - 与学说 dql 连接的子查询

转载 作者:行者123 更新时间:2023-12-01 06:38:09 29 4
gpt4 key购买 nike

我想使用 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 可以做到这一点,现在有人吗?我不能使用 native SQL,因为我想返回真实对象并且我不知道该查询是针对哪个对象运行的(我只知 Prop 有 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');

最佳答案

您不能在 FROM 中放置子查询您的 DQL 的子句。

我假设你的 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
)

请注意,我使用了与绑定(bind)到 :selectedLocales 的区域设置(非空)数组的比较。 .如果您想与其他语言环境匹配,这是为了避免破坏查询缓存。

如果这样做没有真正的优势,我也不建议使用查询构建器构建它,因为如果您动态添加条件,它只会使破坏查询缓存变得更简单(而且,它涉及 3 个查询构建器!)

关于doctrine-orm - 与学说 dql 连接的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13163059/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com