2009-09-09 3 views
6

Propel Criteria를 컴파일하여 SQL을 지우려면 어떻게해야합니까? 나는 $ criteria-> toString()을 시도했다. 그러나 이것은 내가 기대 한 것이 아닙니다. 또한 내가 해봤 ModelPeer :: doSelectStmt ($ 기준)하지만 난이 길 모두의Propel Criteria to SQL을 컴파일하는 방법

$rawSql = BasePeer::createSelectSql($criteria, $params); 

답변

2

를 반환,이 점에 유의하는 것이 중요합니다 Propel은 준비된 구문으로 PDO를 사용하므로 PHP에서 완전히 "내장 된"SQL 문을 얻지는 않습니다. Criteria-> toString()을 사용하는 것이 좋은 시작이지만, Peter가 언급 한 것처럼 실제로 BasePeer :: createSelectSql() 메서드로 많은 작업을 수행합니다.

여기 (추진)에서 가장 완벽한 방법은 SQL이 (자리에) 어떻게 보일까 볼과에 대체됩니다 매개 변수 : 당신은 단지에서 더 나은 주행 거리를 얻을 수 있습니다

$params = array(); // This will be filled with the parameters 
$sql = BasePeer::createSelectSql($criteria, $params); 

print "The raw SQL: " . $sql . "\n"; 
print "The parameters: " . print_r($params, true) . "\n"; 

주 쿼리를 데이터베이스 수준에서 로깅합니다. 물론 PDO가 네이티브 db 준비 문을 사용하도록 구성 (또는 지원)되면 db에도 여전히 placeholder가 표시 될 수 있습니다.

+0

나는 분명 SQL을, 얻고 싶은 말했듯이 원시하지 (예 "를 선택 기사 여기서 NAME = P1") 내가 추진이 같은 기능을 제공합니다 같아요 .. . –

+0

$ rawSql에서 나는 p1, : p2 등의 매개 변수를 대체해야합니다. 그러나이 방법으로 나는 이미 작성된 코드 –

+0

을 작성해야합니다. params 배열의 용도입니다. 나는 분명히하지 않았을 것입니다. 연관 배열로서 매개 변수를 제공하십시오. –

12

우선이라고 생각 원시 SQL (필수 매개 변수 대체)

+0

'wordwrap ($ sql)'을 추가하여 정말 긴 SQL을 페이지에 넣을 수 있습니다. 몇 가지 Propel 쿼리를 다시 PDO로 변환했는데 이것은 매력처럼 작동했습니다. @Hans L. 감사합니다. –

0

나는 주위를하기로 결심했다. 실제로 나는 INSERT INTO ... SELECT이 필요했습니다. 즉, SELECT 문을 기준으로 만들고 을 삽입하고을 추가로 실행합니다.
그래서 BasePeer에 원시 SQL (BasePeer :: createSelectSql)을 작성한 다음 을 삽입하고 앞에을 삽입하십시오. populate 문 값 (: p1, : p2 등)이 필요하지만, BasePeer :: populateStmtValues ​​은 개인 (이유는?)입니다. 다른 곳으로 복사하여 붙여 넣기를해야만했습니다.

0

에도 쉽게 시도는 :

print($criteria->toString()) ; 
관련 문제