Saltar al contenido

Unir subconsulta con la doctrina 2 DBAL

Cecilia, miembro de este gran staff, nos hizo el favor de redactar este post ya que conoce perfectamente el tema.

Solución:

Encontré una solución al adaptar este ejemplo de DQL a DBAL. El truco es obtener el SQL sin procesar de la subconsulta, envolverlo entre paréntesis y unirlo. Los parámetros utilizados en la subconsulta deben establecerse 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 a esta parte de tu pregunta:

No puedo averiguar cómo unirme a la subconsulta usando el generador de consultas de la doctrina 2.5

Puede crear 2 instancias del 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())

Ver ejemplos aquí o aquí o encontrar más usando Google

Valoraciones y comentarios

Eres capaz de asistir nuestra investigación fijando un comentario y puntuándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *