Heim >Datenbank >MySQL-Tutorial >Wie verbinde ich Unterabfragen in Doctrine DBAL?
Unterabfrage mit Doctrine DBAL verbinden
Beim Refactoring einer Zend Framework-Anwendung zur Verwendung von Doctrine 2.5 DBAL kann die Übersetzung eine Herausforderung darstellen komplexe Abfragen aus dem vorherigen Zend_DB-Format. Eine dieser Herausforderungen besteht in der Verknüpfung von Unterabfragen, die zuvor mithilfe von Methoden wie „joinLeft()“ bewerkstelligt wurde.
Obwohl Doctrine DBAL die Verknüpfung von Unterabfragen nicht nativ unterstützt, gibt es eine Problemumgehung, die das Roh-SQL der Unterabfrage nutzt. Indem Sie die Unterabfrage SQL in Klammern setzen und die Funktion sprintf() verwenden, kann sie als reguläre Tabelle verknüpft werden.
Beispiel
Betrachten Sie die folgende Zend_Db-Abfrage:
// 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);
Doctrine DBAL-Übersetzung
In Doctrine DBAL wird das Roh-SQL der Unterabfrage wie folgt erhalten:
$subSelect = $connection->createQueryBuilder() ->select(array('userSurveyID', 'MIN(timestamp) timestamp')) ->from('user_survey_status_entries') ->where('status = :status') ->groupBy('userSurveyID'); $subSelectSQL = $subSelect->getSQL();
Das Unterabfrage-SQL wird dann in Klammern eingeschlossen und in die Hauptabfrage eingefügt:
$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);
Dieser Ansatz ermöglicht das Verknüpfen von Unterabfragen in Doctrine DBAL, während gleichzeitig die Möglichkeit erhalten bleibt, die Abfrage später im Code dynamisch zu erweitern.
Das obige ist der detaillierte Inhalt vonWie verbinde ich Unterabfragen in Doctrine DBAL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!