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

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-24 03:52:31297parcourir

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);

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();

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);

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!

Déclaration:
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