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!