如何在extbase中调试查询?

pdu*_*ler 10 mysql typo3 typo3-6.2.x typo3-7.6.x

$query = $this->createQuery();

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

我怎样才能在extbase中调试这样生成的查询?当再次创建相同的查询(但没有execute())并尝试使用var_dump或内部t3lib_div :: debug显示它时,我只会收到一个空白页面.

pga*_*mpe 21

在版本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());
Run Code Online (Sandbox Code Playgroud)

  • 为什么不直接将其内置到 DebuggerUtility 中?! (3认同)
  • 我认为需要可执行的SQL语句。`$queryParser = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser::class); $sql = $queryParser->convertQueryToDoctrineQueryBuilder($query)->getSQL(); $paramters = $queryParser->convertQueryToDoctrineQueryBuilder($query)->getParameters(); $搜索=数组(); $替换=数组(); foreach ($paramters as $k => $v) { $search[] = ':' . $k;$replace[] = '\'' 。$v 。'\''; $sql = str_replace($search, $replace, $sql); \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($sql); ` (3认同)

j4k*_*4k3 9

此信息已过时并在TYPO3 8.7中弃用.有关调试extbase查询的更新方法,请参阅下面的@pgampe的答案.

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');
Run Code Online (Sandbox Code Playgroud)

结果是查询部分的表视图,由SQL关键字拆分,例如:

有问题的查询的表视图

请记住,您的Repository返回的QueryResult可能仍然与SQL查询结果不同.Extbase使用PropertyMapper尝试将每个结果行转换为ExtbaseObject.如果PropertyMapper配置错误或该行包含根据配置无法转换为数据类型的数据,则将默默跳过这些对象.


xan*_*ndi 7

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

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

return $result;
Run Code Online (Sandbox Code Playgroud)

  • 要扩展:你也可以指定`1`(与`true`相同,用于'带有错误的显示查询')或`2`(用于`显示所有查询`). (4认同)
  • `$ GLOBALS ['TYPO3_DB'] - > debugOutput = 2;`不工作......我不明白为什么简单地启用sql-queries的输出是如此麻烦...... (3认同)

Urs*_*Urs 5

对extbase的这种破解很脏,但很有用:

在typo3/sysext/extbase/Classes/Persistence/Storage/Typo3DbBackend.php中,在return语句之前编辑方法buildQuery(array $ sql),添加:

t3lib_div::debug($statement, 'SQL Query Extbase');
Run Code Online (Sandbox Code Playgroud)

使用后删除,不要忘记这将影响在extbase上运行的所有内容,因此仅在开发环境中使用

资料来源:http://sancer-media.net/2011/extbase-schneller-mysql-debug.html

  • 注意,在TYPO3 6.1中,这是在typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php - 但黑客不再工作了 (3认同)