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
733 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!

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