ホームページ >データベース >mysql チュートリアル >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 サイトの他の関連記事を参照してください。