如何在 Doctrine DBAL 中加入子查詢?

Linda Hamilton
發布: 2024-10-24 03:52:31
原創
297 人瀏覽過

How to Join Subqueries in Doctrine DBAL?

將子查詢與Doctrine DBAL 結合

在重構Zend Framework 應用程式以使用Doctrine 2.5 DBAL 的過程中,翻譯可能具有挑戰性以前的Zend_DB 格式的複雜查詢。其中一個挑戰在於連接子查詢,這之前是使用 joinLeft() 等方法完成的。

儘管 Doctrine DBAL 本身不支援連接子查詢,但有一種解決方法可以利用子查詢的原始 SQL。透過將子查詢 SQL 括在括號中並使用 sprintf() 函數,可以將其作為常規表連接。

範例

考慮以下Zend_Db 查詢:

// 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 翻譯

Doctrine DBAL 翻譯

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

$subSelectSQL = $subSelect->getSQL();
登入後複製

Doctrine DBAL 翻譯

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

子查詢SQL然後用括號括起來並加入主查詢:這種方法允許在Doctrine DBAL 中加入子查詢,同時保持稍後在程式碼中動態擴充查詢的能力。

以上是如何在 Doctrine DBAL 中加入子查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!