Únase a la subconsulta con doctrine 2 DBAL

Estoy refacturando una aplicación de Zend Framework 2 para usar doctrine 2.5 DBAL en lugar de Zend_DB (ZF1). Tengo la siguiente consulta Zend_Db:

$subSelect = $db->select() ->from('user_survey_status_entries', array('userSurveyID', 'timestamp' => 'MIN(timestamp)')) ->where('status = ?', UserSurveyStatus::ACCESSED) ->group('userSurveyID'); $select = $db->select() // $selectColNames contains columns both from the main query and // the subquery (eg firstAccess.timestamp AS dateFirstAccess). ->from(array('us' => 'user_surveys'), $selectColNames) ->joinLeft(array('firstAccess' => $subSelect), 'us.userSurveyID = firstAccess.userSurveyID', array()) ->where('us.surveyID = ?', $surveyID); 

Esto da como resultado la siguiente consulta MySQL:

 SELECT `us`.`userSurveyID`, // More columns from main query `us` `firstAccess`.`timestamp` AS `dateFirstAccess` FROM `user_surveys` AS `us` LEFT JOIN ( SELECT `user_survey_status_entries`.`userSurveyID`, MIN(timestamp) AS `timestamp` FROM `user_survey_status_entries` WHERE (status = 20) GROUP BY `userSurveyID` ) AS `firstAccess` ON us.userSurveyID = firstAccess.userSurveyID WHERE (us.surveyID = '10') 

No puedo encontrar la manera de unirme a la subconsulta con el generador de consultas doctrine 2.5. En la consulta principal, necesito seleccionar columnas de la subconsulta.

He leído aquí que la doctrine no admite la unión de subconsultas. Si eso sigue siendo cierto, ¿puedo escribir esta consulta de otra manera utilizando el generador de consultas SQL de doctrine DBAL? Es posible que el SQL nativo no sea una buena solución para mí, ya que esta consulta se ampliará dinámicamente más adelante en el código.

Encontré una solución al adaptar este ejemplo de DQL a DBAL. El truco es obtener el SQL sin formato de la subconsulta, envolverlo entre paréntesis y unirlo. Los parámetros utilizados en la subconsulta se deben establecer en la consulta principal:

 $subSelect = $connection->createQueryBuilder() ->select(array('userSurveyID', 'MIN(timestamp) timestamp')) ->from('user_survey_status_entries') // Instead of setting the parameter in the main query below, it could be quoted here: // ->where('status = ' . $connection->quote(UserSurveyStatus::ACCESSED)) ->where('status = :status') ->groupBy('userSurveyID'); $select = $connection->createQueryBuilder() ->select($selectColNames) ->from('user_surveys', 'us') // Get raw subquery SQL and wrap in brackets. ->leftJoin('us', sprintf('(%s)', $subSelect->getSQL()), 'firstAccess', 'us.userSurveyID = firstAccess.userSurveyID') // Parameter used in subquery must be set in main query. ->setParameter('status', UserSurveyStatus::ACCESSED) ->where('us.surveyID = :surveyID')->setParameter('surveyID', $surveyID); 

Para responder esta parte de tu pregunta:

No puedo encontrar la forma de unirme a la subconsulta con el generador de consultas doctrine 2.5

Puede hacer 2 instancias de generador de consultas y usar el DQL del segundo dentro de una cláusula de su primera consulta. Un ejemplo:

 ->where($qb->expr()->notIn('u.id', $qb2->getDQL()) 

Vea ejemplos aquí o aquí o encuentre más usando Google