-->

Extbase - 获取从查询创建SQLExtbase - 获取从查询创建SQL(Extbase

2019-05-12 07:19发布

我想从我的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 extenstions

Answer 1:

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

一般而言,您需要在年底这段代码buildQuery(array $sql)方法(*) -前右return $statement;

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

(*)类文件:

  • 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方法,只是取了$查询,如后面添加条件( 装饰很重要!):

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


Answer 2:

在TYPO3 6.2,您可以使用Extbase DebuggerUtility调试查询。

前$查询 - 添加该代码>的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));


Answer 3:

在不改变任何TYPO3的核心代码,而不是至今在任何论坛上提到的一个简单的方法是使用PHP“连载()”方法:

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

在结果对象你找到SQL查询(“声明”; ......)



Answer 4:

改善biesiors回答:

作为Extbase调用BuildQuery对于()后,将替换一些占位符,你可能更喜欢到调试输出放入getObjectDataByQuery()刚过$这个- > replacePlaceholders($的SQL,$参数,$表名);

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

此外,更好地利用调试()代替的var_dump()。
[文件: typo3\sysext\extbase\Classes\Persistence\Generic\Storage\Typo3DbBackend.php 。 在6.1]版本339线:



Answer 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在您的仓库



Answer 6:

我只是延长了上面的代码片段,以$ _GET条件。 进行调试,只是追加“?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>');
    }


Answer 7:

使用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 ,失去了它的第二个参数。



Answer 8:

我建议下“SYS”阵列设置此在typo3conf / LocalConfiguration.php文件

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

然后写在查询错字段名故意然后执行代码。 这将显示上次查询,错误执行。



文章来源: Extbase - get created sql from query