>  기사  >  데이터 베이스  >  Doctrine DBAL에서 하위 쿼리를 조인하는 방법은 무엇입니까?

Doctrine DBAL에서 하위 쿼리를 조인하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-24 03:52:31297검색

How to Join Subqueries in Doctrine DBAL?

Doctrine DBAL을 사용하여 하위 쿼리 결합

Doctrine 2.5 DBAL을 사용하기 위해 Zend Framework 애플리케이션을 리팩토링하는 과정에서 번역이 어려울 수 있습니다. 이전 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에서는 하위 쿼리의 원시 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.