Doctrine DBAL でサブクエリを結合するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-24 03:52:31
オリジナル
296 人が閲覧しました

How to Join Subqueries in Doctrine DBAL?

Doctrine DBAL でサブクエリを結合

Doctrine 2.5 DBAL を使用するように Zend Framework アプリケーションをリファクタリングするプロセスでは、翻訳が困難な場合があります以前の Zend_DB 形式からの複雑なクエリ。そのような課題の 1 つは、サブクエリの結合にあり、以前は 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 では、サブクエリの生の SQL は次のように取得されます。

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

$subSelectSQL = $subSelect->getSQL();
ログイン後にコピー

サブクエリ SQL次に、括弧で囲まれ、メインクエリに結合されます:

$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);
ログイン後にコピー

このアプローチにより、コードの後半でクエリを動的に拡張する機能を維持しながら、Doctrine DBAL でサブクエリを結合できます。

以上がDoctrine DBAL でサブクエリを結合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!