複雑なクエリには、DoctrineのDQLlanguajeを試すことができます。
$q = Doctrine_Query::create()
->select('u.id')
->from('User u')
->where('u.id NOT IN (SELECT u2.id FROM User u2 INNER JOIN u2.Groups g)');
echo $q->getSqlQuery();
http://doctrine.readthedocs.org/en/latest/en/manual/dql-doctrine-query-language.html#subqueries
または、データベースにビューを作成し、それをより単純なDoctrineクエリのソーステーブルとして使用することもできます。
CREATE VIEW view_name AS
SELECT *
FROM (
(SELECT *, e1.stop_date as sort_date FROM `event` e1 WHERE ...)
UNION
(SELECT *, e2.start_date as sort_date FROM `event` e2 WHERE ...)
) e3
ORDER BY e3.sort_date
私はプロジェクトで両方のアプローチを使用し、うまく機能しました。データへのアクセス方法、更新が必要かどうか、ビューの作成が許可されているかどうかなどによって異なります。