Error in Nested SubQuery In DQL: Class '('

2019-02-26 02:43发布

I have a DQL as like below:

SELECT at, count(at.id) FROM AccountTriple at JOIN at.property p JOIN at.account ac WHERE p.create_analytics = '1' GROUP BY at.property, at.value, ac.service

As you can see, it has three joins. As 'at' and 'ac' both have large amount of data. In attempt to optimize it, I am trying to move the "p.create_analytics = '1'" checking before join to 'ac' to give it a smaller data set to join. I am trying to achieve something like this:

SELECT at, count(at.id) FROM ( SELECT at FROM AccountTriple at JOIN at.property p WHERE p.create_analytics = '1' ) JOIN at.account ac  GROUP BY at.property, at.value, ac.service

But somehow, my syntax isn't working. A error message is showing as below:

Semantical Error] line 0, col 29 near '( SELECT at FROM': Error: Class '(' is not defined.

Didn't find similar example anywhere else as well. Does anyone can help to fix this DQL query to get working? Thanks in advance.

1条回答
淡お忘
2楼-- · 2019-02-26 02:49

Use the createSubquery() function to create a subquery in Doctrine. You can then nest the subquery into your main query.

Example

// build root query
$query = Doctrine_Query::create()
  ->from('Movie m')
  ->where('name = ?', 'Prometheus')
;

// build subquery
$subquery = $query->createSubquery()
  ->from('SeenMovie sm')
  ->where('m.name = sm.name')
;

// nest subquery and execute
$query->where('EXISTS (' . $subquery->getDql() . ')')->execute();

Further Reading
A Bulletproof Pattern for Creating Doctrine Subqueries of Any Complexity

查看更多
登录 后发表回答