Heim  >  Artikel  >  Datenbank  >  Wie verbinde ich Unterabfragen in Doctrine DBAL?

Wie verbinde ich Unterabfragen in Doctrine DBAL?

Linda Hamilton
Linda HamiltonOriginal
2024-10-24 03:52:31297Durchsuche

How to Join Subqueries 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn