2012-06-27 1 views
11

내 코드를 디버깅하기 위해 실행되는 명시 적 SQL 쿼리를보고 싶습니다.쿼리의 매개 변수를 보려면 어떻게합니까?

나는 createQueryBuilder와 쿼리를 작성하고 내가 달성 가장 명백한 것은 사용하여 원시 쿼리를 가지고있다 :

$qb->getQuery()->getSQL(); 

문제는 대신 매개 변수의 내가 홀더 (?)를 참조한다는 것입니다. 웹상에서 몇 가지 솔루션을 발견했지만 Symfony-2에는 1.3 및 1.4, 아무것도 사용하지 않았습니다.

아이디어가 있으십니까? 감사!

+3

사실, 귀하의 질문은이 설명서의 복제본입니다. http://stackoverflow.com/q/2095394/795876. Doctrine은 prepared statement를 사용하고 있으므로 PHP 측에서 결코 "진짜"SQL 쿼리가 존재하지 않으며 Doctrine은이를 표시 할 수 없습니다. 그러나 디버깅을 위해이 솔루션 http://stackoverflow.com/a/10577703/795876을 읽을 수 있습니다. – fsenart

+2

또한 doctrine 2에는 sqlLogger 클래스가 있습니다. http://doctrine-orm.readthedocs.org/en/2.0.x/reference/configuration.html#sql-logger-optional – manix

+0

** fsehat ** -이 솔루션처럼 보입니다. Symfony 1.4에서, 나는 전체 프로젝트에서'getSqlQuery' 함수 나'getFlattenedParams' (내가 누락 된 함수)를 찾을 수 없었다. ** manix ** - Symfony 2.x에서 로거를 사용하는 방법에 대한 추가 문서가 있습니까? 좋은 해결책 인 것 같지만 좋은 문서는 찾을 수 없습니다. ** 둘 다 주셔서 감사합니다! ** – guyaloni

답변

27

당신은 $query->getParameters()를 사용하여 자리 표시 자에 의해 사용되는 매개 변수에 액세스 할 수 있습니다, 그래서 당신은 사용하여 쿼리를 디버깅 할 수 있습니다 :

$query = $qb->getQuery(); 
print_r(array(
    'sql'  => $query->getSQL(), 
    'parameters' => $query->getParameters(), 
)); 
+2

기본적으로 좋은 아이디어입니다.문제는 매개 변수 가방에 객체가 포함되어있을 수 있으며 인쇄하려고하면 거대한 문자열이 표시된다는 것입니다. 내가하고 싶은 것은'$ query-> getParameters()'에 의해 리턴 된 매개 변수 bag을 placeholder'?'를 대체 할 수있는 문자열의 배열로 변환하는 것이다. – guyaloni

+2

나는이 어레이가 이미 스칼라 값의 배열이라고 생각한다. setParameter 메소드 인 https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L202를 보면, 배열과 객체를 스칼라 값으로 변환하는 processParameterValue를 호출합니다. https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L227 – AdrienBrault

+0

웃긴, 이해합니다. .) 모든 벤더의 마지막 버전, 그리고'AbstractQuery.php'와'Query.php'는 조금 다릅니다. 아마 내가 가지고있는 것은 Doctrine 2.1이고이 코드는 2.2입니다. 어쨌든, 당신의 대답에 따라 원시 sql + 매개 변수를 반환하는'Query.php' 파일에 메소드를 추가했습니다. 감사! – guyaloni

2

당신은 쉽게 다음과 같은 방법을 사용하여 SQL 매개 변수에 액세스 할 수 있습니다.

$result = $qb->getQuery()->getSQL(); 

    $param_values = ''; 
    $col_names = ''; 

    foreach ($result->getParameters() as $index => $param){    
      $param_values .= $param->getValue().','; 
      $col_names .= $param->getName().','; 
    } 

    //echo rtrim($param_values,','); 
    //echo rtrim($col_names,',');  

그래서 당신은 $param_values$col_names을 인쇄하는 경우, 당신은 SQL 및 각각의 열 이름을 통과하는 매개 변수 값을 얻을 수 있습니다.

참고 : $param이 배열을 반환하면 IN (:?)의 매개 변수는 일반적으로 중첩 배열로 제공되므로 반복해야합니다. 다른 접근 방법을 발견하는 경우

한편 우리와 함께 공유 할 정도로 친절하십시오 :

감사합니다!

0

QueryBuilder로 이미 구축 된 5 개의 쿼리를 사용하여 requete union (DQL 또는 QueryBuilder에서는 불가능)을 빌드해야했습니다. 그래서 이러한 쿼리를 재사용하지만 getParameters() 함수를 사용하여 문제가 발생했습니다. 왜냐하면 매개 변수에 주어진 순서대로 매개 변수를 제공하기 때문입니다. 쿼리 빌더를 사용할 때 장점 중 하나는 yhou 원하는 순서로 쿼리를 만들 수 있지만 매개 변수를 검색 할 때 더러워 질 수 있습니다. 내가 구축 한 다음 함수이를 방지하려면 다음 SQL 및 정렬 매개 변수를 검색 할 때 지금

$getSqlWithParams = \Closure::bind(function(){ 
     return [$this->getSql(), $this->processParameterMappings($this->_parserResult->getParameterMappings())]; 
    }, null, Query::class); 

을 당신이 할 :

$getSqlWithParams()->call($query) 

교리 \ ORM \ 쿼리 문 \ 사용을 잊지 마세요 . 그리고 voilà!