Symfony Doctrine:使用子查询和“HAVING”子句而不使用EXISTS

时间:2015-07-16 12:13:00

标签: symfony doctrine-orm doctrine

在Symfony项目中,我正在尝试使用计算字段进行查询。简化了很多我的SQL会是这样的:

SELECT o.id, (p.price_a + p.price_b) as total_price
FROM objects o
INNER JOIN prices p
ON o.id = p.object_id
HAVING total_price > 10

我的计算字段更复杂,使用的外部值会发生变化,我无法预先计算出来。

因为我只想要不同的object.id我将上面的代码添加为子查询:

SELECT DISTINCT o_id 
FROM (
  SELECT o.id as o_id, (p.price_a + p.price_b) as total_price
  FROM object o
  INNER JOIN price p
  ON o.id = p.object_id
  HAVING total_price > 10)

在Symfony中,我希望此查询仅返回不同的“对象”。

我在查询构建器中尝试了很多选项,但我无法在“FROM”子句中添加子查询。

我试图避免使用低效的EXISTS子句:

SELECT DISTINCT o.id 
FROM objects o
WHERE EXISTS (
  SELECT p.*, (p.price_a + p.price_b) as total_price
  FROM prices p
  WHERE o.id = p.object_id
  HAVING total_price > 10)

有没有办法在不使用“EXISTS”的情况下使用Query Builder执行此操作?

1 个答案:

答案 0 :(得分:0)

由于HIDDEN关键字,我已经解决了这个问题。使用HIDDEN,您可以标记字段以避免ORM提取。删除计算字段非常理想。

使用DQL:

SELECT o, (p.price_a + p.price_b) AS HIDDEN total_price
FROM TestObjectBundle:Object o
INNER JOIN TestObjectBuncle:Price p
GROUP BY o
HAVING total_price > 10