Extbase - 从查询中获取创建的sql

alp*_*nyx 9 sql typo3 extbase

我想从我的typo3扩展中获取一些数据库表.扩展基于extbase.

查询始终只返回数据,但数据存在

我试过这个:

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

$results = $query->execute();
Run Code Online (Sandbox Code Playgroud)

还有这个:

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

两者都返回null作为结果.

是否有可能获得该类创建的sql来查找bug的位置?

我查看了一些extbase持久化类,但没有找到线索

编辑:对于那些感兴趣的人..我找到了一个"解决方案".

如果使用statement()方法创建查询,则可以使用此函数打印查询

echo $query->getStatement()->getStatement();
Run Code Online (Sandbox Code Playgroud)

它不会取代占位符.但是你可以用这种方法得到变量

var_dump($query->getStatement()->getBoundVariables());
Run Code Online (Sandbox Code Playgroud)

这是我找到的最佳解决方案,无需编辑extbase扩展

Chr*_*olo 6

在TYPO3 6.2中,您可以使用Extbase DebuggerUtility来调试查询.

在$ query-> execute()之前添加此代码:

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


bie*_*ior 5

检查这个片段,虽然使用起来不太舒服但它有很大帮助:

一般来说,你需要在buildQuery(array $sql)方法(*)结尾处使用此代码- 就在之前return $statement;

if (in_array("your_table_name", $sql['tables'])) {
    var_dump($statement);
    print_r($statement);
}
Run Code Online (Sandbox Code Playgroud)

(*)类文件:

  • TYPO3版本:4.x: typo3/sysext/extbase/Classes/Persistence/Storage/Typo3DbBackend.php
  • TYPO3版本:6.x: typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php

在6.2.x ...

您可以在\TYPO3\CMS\Core\Database\DatabaseConnection::exec_SELECTquery方法内尝试,只需在获取$ query后添加条件,就像(trim很重要!):

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

  • 我再也找不到6.2中的`buildQuery`方法了 (5认同)