Maison > base de données > tutoriel mysql > Comment rejoindre des sous-requêtes dans Doctrine DBAL ?

Comment rejoindre des sous-requêtes dans Doctrine DBAL ?

Linda Hamilton
Libérer: 2024-10-24 03:52:31
original
379 Les gens l'ont consulté

How to Join Subqueries in Doctrine DBAL?

Rejoindre une sous-requête avec Doctrine DBAL

Dans le processus de refactorisation d'une application Zend Framework pour utiliser Doctrine 2.5 DBAL, il peut être difficile de traduire requêtes complexes du format Zend_DB précédent. L'un de ces défis réside dans la jonction de sous-requêtes, qui étaient auparavant réalisées à l'aide de méthodes telles que joinLeft().

Bien que Doctrine DBAL ne prenne pas en charge nativement la jonction de sous-requêtes, il existe une solution de contournement qui utilise le SQL brut de la sous-requête. En plaçant la sous-requête SQL entre parenthèses et en utilisant la fonction sprintf(), elle peut être jointe comme une table normale.

Exemple

Considérez la requête Zend_Db suivante :

// Subquery to find the minimum timestamp for each user survey.
$subSelect = $db->select()
   ->from('user_survey_status_entries', array('userSurveyID', 'timestamp' => 'MIN(timestamp)'))
   ->where('status = ?', UserSurveyStatus::ACCESSED)
   ->group('userSurveyID');

// Main query to join user surveys and subquery results.
$select = $db->select()
   ->from(array('us' => 'user_surveys'), $selectColNames)
   ->joinLeft(array('firstAccess' => $subSelect), 'us.userSurveyID = firstAccess.userSurveyID', array())
   ->where('us.surveyID = ?', $surveyID);
Copier après la connexion

Traduction Doctrine DBAL

Dans Doctrine DBAL, le SQL brut de la sous-requête est obtenu comme suit :

$subSelect = $connection->createQueryBuilder()
   ->select(array('userSurveyID', 'MIN(timestamp) timestamp'))
   ->from('user_survey_status_entries')
   ->where('status = :status')
   ->groupBy('userSurveyID');

$subSelectSQL = $subSelect->getSQL();
Copier après la connexion

La sous-requête SQL est ensuite placé entre parenthèses et joint dans la requête principale :

$select = $connection->createQueryBuilder()
   ->select($selectColNames)
   ->from('user_surveys', 'us')
   ->leftJoin('us', sprintf('(%s)', $subSelectSQL), 'firstAccess', 'us.userSurveyID = firstAccess.userSurveyID')
   ->setParameter('status', UserSurveyStatus::ACCESSED)
   ->where('us.surveyID = :surveyID')
   ->setParameter('surveyID', $surveyID);
Copier après la connexion

Cette approche permet de joindre des sous-requêtes dans Doctrine DBAL, tout en conservant la possibilité d'étendre dynamiquement la requête plus tard dans le code.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal