Как отладить запрос в extbase? - PullRequest
10 голосов
/ 22 февраля 2011
$query = $this->createQuery();

    return $query->matching($query->like('linker', "$linkerKey=$linkerValue"))
        ->setOrderings(array('crdate' => $ordering))
        ->execute();

Как я могу отладить такой сгенерированный запрос в extbase? При повторном создании того же запроса (но без execute ()) и попытке отобразить его с помощью var_dump или внутреннего t3lib_div :: debug я просто получаю пустую страницу.

Ответы [ 7 ]

20 голосов
/ 31 мая 2017

В версии 8.7 LTS необходимо выбрать другой способ:

 $queryParser = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser::class);
 \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->convertQueryToDoctrineQueryBuilder($query)->getSQL());
 \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->convertQueryToDoctrineQueryBuilder($query)->getParameters());
9 голосов
/ 20 мая 2015

Эта информация устарела и устарела в TYPO3 8.7.Обратитесь к ответу @pgampe ниже для более актуального способа отладки запросов extbase.

В Extbase теперь есть QueryParser для этого.В своем методе хранилища прямо перед возвратом выполненного запроса вставьте:

    $parser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbQueryParser');  
    $queryParts = $parser->parseQuery($query); 
    \TYPO3\CMS\Core\Utility\DebugUtility::debug($queryParts, 'query');

В результате вы получите представление таблицы частей запроса, разделенных по ключевым словам SQL, например:

table view of the query in question

Имейте в виду, что QueryResult, который возвращает ваш репозиторий, может по-прежнему отличаться от результата SQL-запроса.Extbase использует PropertyMapper, чтобы попытаться преобразовать каждую результирующую строку в ExtbaseObject.Если PropertyMapper настроен неправильно или строка содержит данные, которые не могут быть преобразованы в типы данных в соответствии с конфигурацией, эти объекты будут пропущены без уведомления.

7 голосов
/ 16 апреля 2011
$query = $this->createQuery();
$result = $query->matching($query->like('linker', "$linkerKey=$linkerValue"))
   ->setOrderings(array('crdate' => $ordering))
   ->execute();

$GLOBALS['TYPO3_DB']->debugOutput = true;

return $result;
5 голосов
/ 22 июня 2013

Этот хак для extbase грязный, но полезный:

В typo3 / sysext / extbase / Классы / Постоянство / Хранилище / Typo3DbBackend.php отредактируйте метод buildQuery (массив $ sql) перед оператором возврата добавьте:

t3lib_div::debug($statement, 'SQL Query Extbase');

Удалить после использования, и не забывайте, что это повлияет на все, что работает на extbase, поэтому используйте только в среде разработки

Источник: http://sancer -media.net / 2011 / extbase-schneller-mysql-debug.html

1 голос
/ 17 января 2018

Это работает, пока поддерживается $ GLOBALS ['TYPO3_DB'].Он покажет вам полный SQL-запрос на сборку.

/**
 * @param \TYPO3\CMS\Extbase\Persistence\QueryResultInterface $queryResult
 * @param bool $explainOutput
 * @return void
 */
public function debugQuery(
    \TYPO3\CMS\Extbase\Persistence\QueryResultInterface $queryResult,
    $explainOutput = false
) {
    $GLOBALS['TYPO3_DB']->debugOuput = 2;
    if ($explainOutput) {
        $GLOBALS['TYPO3_DB']->explainOutput = true;
    }
    $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = true;
    $queryResult->toArray();
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
        $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery
    );
    $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = false;
    $GLOBALS['TYPO3_DB']->explainOutput = false;
    $GLOBALS['TYPO3_DB']->debugOuput = false;
}

Так что с помощью этой функции вы можете сделать что-то подобное в вашем контроллере:

$all = $this->repository->findAll();
$this->repository->debugQuery($all);
1 голос
/ 21 ноября 2015

В версии 6.2x или новее вы можете отлаживать объект результата в extBase, например:

В хранилище:

return $ query-> execute (true);// "true" вернет результат массива

Или вы также можете отладить объект результата в Controller:

$ resultObject = $ this-> yourRepository-> findAll ();\ TYPO3 \ CMS \ Extbase \ Utility \ DebuggerUtility :: var_dump ($ resultObject);

0 голосов
/ 08 ноября 2014

Простой способ без изменения кода ядра Typo3, который пока не упоминался ни на одном форуме, - использовать метод php "serialize ()":

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

В объекте результата вы найдете SQL-запрос (ищите "заявление;" ...)

...