Maison > base de données > tutoriel mysql > Comment joindre des sous-requêtes à l'aide de Doctrine 2 DBAL ?

Comment joindre des sous-requêtes à l'aide de Doctrine 2 DBAL ?

DDD
Libérer: 2024-10-24 00:15:02
original
682 Les gens l'ont consulté

How to Join Subqueries Using Doctrine 2 DBAL?

Rejoindre des sous-requêtes avec Doctrine 2 DBAL

Dans une application Zend Framework 2, Zend_DB est remplacé par Doctrine 2.5 DBAL. La requête Zend_DB suivante le démontre :

$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 (e.g. firstAccess.timestamp AS dateFirstAccess).
    ->from(array('us' => 'user_surveys'), $selectColNames)
    ->joinLeft(array('firstAccess' => $subSelect), 'us.userSurveyID = firstAccess.userSurveyID', array())
    ->where('us.surveyID = ?', $surveyID);
Copier après la connexion

Cependant, les utilisateurs souhaitent rejoindre la sous-requête à l'aide du générateur de requêtes Doctrine 2.5 et sélectionner les colonnes de la sous-requête dans la requête principale. Malheureusement, Doctrine ne prend pas en charge la jointure de sous-requêtes.

Heureusement, les utilisateurs peuvent utiliser le générateur de requêtes SQL de Doctrine DBAL pour écrire cette requête :

$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);
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal