복붙노트

[SQL] Extbase은 - 쿼리에서 SQL을 생성 얻을

SQL

Extbase은 - 쿼리에서 SQL을 생성 얻을

난 내 TYPO3 확장에서 일부 데이터베이스 테이블을 싶어. 확장은 extbase을 기반으로합니다.

쿼리는 항상 아무 것도 반환하지 않습니다하지만 데이터가 존재

나는 이것을 시도했다 :

$query = $this->createQuery();
$query->statement('SELECT * FROM `my_table`
    WHERE field = ? ORDER BY date DESC LIMIT 1',
    array($condition));

$results = $query->execute();

이:

$query = $this->createQuery();

$query->matching($query->equals('field', $condition));
$query->setOrderings(array('date' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
$query->setLimit(1);

$results = $query->execute();

모두 반환 결과로 널 (null).

이 클래스는 버그가 어디 있는지 찾기 위해 생성하는 SQL을 얻을 수 있습니까?

좀 extbase 영속 클래스에보고했지만 단서를 찾지 못했습니다

편집하다: 관심이있는 사람들을 위해 .. 나는 "솔루션"을 발견했다.

당신이 문 () 메소드를 사용하여 쿼리를 작성하는 경우, 당신은이 기능으로 쿼리를 인쇄 할 수 있습니다

echo $query->getStatement()->getStatement();

그것은 자리를 대체하지 않습니다. 그러나이 방법으로 변수를 얻을 수 있습니다

var_dump($query->getStatement()->getBoundVariables());

최고의 솔루션 그게 전부 내가 extbase 확장을 편집하지 않고, 발견

해결법

  1. ==============================

    1.그것이 많은 도움이 사용 매우 편안 아니다 있지만,이 코드를 확인하십시오 :

    그것이 많은 도움이 사용 매우 편안 아니다 있지만,이 코드를 확인하십시오 :

    일반적으로 당신은 buildQuery (배열 $ SQL) 방법의 끝 부분에이 코드가 필요합니다 (*) - 바로 반환 $ 문 앞에;

    if (in_array("your_table_name", $sql['tables'])) {
        var_dump($statement);
        print_r($statement);
    }
    

    (*) 클래스 파일 :

    당신은 같은 $ 쿼리 가져 오는 후 조건을 추가, \ TYPO3 \ CMS \ 코어 \ 데이터베이스 \ DatabaseConnection :: exec_SELECTquery 방법 내에서 시도 할 수 있습니다 (트림이 중요!)를 :

    public function exec_SELECTquery($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy = '', $limit = '') {
        $query = $this->SELECTquery($select_fields, $from_table, $where_clause, $groupBy, $orderBy, $limit);
    
        if (trim($from_table) == 'fe_users') {
            DebuggerUtility::var_dump($query);
        }
    
    // rest of method
    
  2. ==============================

    2.TYPO3 6.2에서는 쿼리를 디버깅하는 Extbase DebuggerUtility를 사용할 수 있습니다.

    TYPO3 6.2에서는 쿼리를 디버깅하는 Extbase DebuggerUtility를 사용할 수 있습니다.

    () 실행> $ 질의 - 전에이 코드를 추가합니다 :

    /** @var Typo3DbQueryParser $queryParser */
    $queryParser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbQueryParser');
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->parseQuery($query));
    
  3. ==============================

    3.지금까지 어떤 포럼에서 언급 된 모든 TYPO3 핵심 코드와하지를 변경하지 않고 쉬운 방법은 PHP를 사용한다 "직렬화 ()"방법 :

    지금까지 어떤 포럼에서 언급 된 모든 TYPO3 핵심 코드와하지를 변경하지 않고 쉬운 방법은 PHP를 사용한다 "직렬화 ()"방법 :

    $result = $query->execute();
    echo (serialize($result));
    

    결과 개체에서 당신은 SQL 쿼리를 찾을 수 있습니다 ( "문을,"...)

  4. ==============================

    4.biesiors 응답 개선 :

    biesiors 응답 개선 :

    Extbase가 buildQuery ()를 호출 한 후 약간의 자리를 대체, 당신은 단지 $ this-> replacePlaceholders ($ SQL, $ 매개 변수, $ TABLENAME) 후 getObjectDataByQuery ()에 디버그 출력을 배치하는 것을 선호 할 수;

    if (strpos($sql, "your_table_name.")) {
        debug($sql, 'my debug output');
    };
    

    또한,보다 효율적으로 사용 디버그 () 대신 위해서 var_dump의 (). [파일 : TYPO3 \ sysext \ extbase \ 클래스 \ 지속성 \ 일반 \ 저장 \ Typo3DbBackend.php. 버전 6.1]에서 라인 339 :

  5. ==============================

    5.

    $query = $this->createQuery();
    $query->getQuerySettings()->setReturnRawQueryResult(TRUE);
    $getHotelInfo = 'SELECT * FROM `my_table` WHERE field = ? ORDER BY date DESC LIMIT 1';
    return $query->statement($getHotelInfo)->execute();
    

    쿼리를 실행하면 저장소에 대한 쓰기 'setReturnQueryResult'에있다

  6. ==============================

    6.난 그냥 $ _GET을 조건으로, 위의 코드 조각을 확장했다. 디버깅을 위해, 단지 APPEND? "dbg_table = tx_some_of_my_tables"주소, 그리고 당신에게있는 거 갈 준비 ;-)

    난 그냥 $ _GET을 조건으로, 위의 코드 조각을 확장했다. 디버깅을 위해, 단지 APPEND? "dbg_table = tx_some_of_my_tables"주소, 그리고 당신에게있는 거 갈 준비 ;-)

    if (in_array($_GET['dbg_table'], $sql['tables'])) {
            echo('<div style="background: #ebebeb; border: 1px solid #999; margin-bottom: 20px; padding: 10px;"><pre style="white-space: normal">'.$statement.'</pre></div>');
        }
    
  7. ==============================

    7.TYPO3 6.1을 사용할 때 문을 디버깅 할 클리너 방법은 Typo3DbBackend의 쿼리 파서를 사용하는 것입니다.

    TYPO3 6.1을 사용할 때 문을 디버깅 할 클리너 방법은 Typo3DbBackend의 쿼리 파서를 사용하는 것입니다.

    $parser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbBackend');
    $params = array();
    $queryParts = $parser->parseQuery($query, $params);
    
    \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('query', 'my_extension', 1, array('query' => $queryParts, 'params' => $params));
    

    파서는 생성 된 SQL 구문의 다른 부분을 포함하는 배열을 반환합니다.

    TYPO3 6.2와 parseQuery 방법은 Typo3DbQueryParser으로 이동하고 두 번째 파라미터를 잃었다.

  8. ==============================

    8.난 SYS "배열 하에서 typo3conf / LocalConfiguration.php 파일이 설정 제안

    난 SYS "배열 하에서 typo3conf / LocalConfiguration.php 파일이 설정 제안

    'SYS' => array(
    ......
    'displayErrors' => 1,
    'sqlDebug' => 1
    .......
    )
    

    다음 의도적으로 쿼리에 잘못된 필드 이름을 작성하고 다음 코드를 실행합니다. 이 마지막 쿼리가 오류로 실행이 표시됩니다.

  9. from https://stackoverflow.com/questions/13084863/extbase-get-created-sql-from-query by cc-by-sa and MIT license