首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Extbase -从查询中创建sql

Extbase -从查询中创建sql
EN

Stack Overflow用户
提问于 2012-10-26 10:07:13
回答 8查看 18.8K关注 0票数 9

我想从我的typo3扩展中获得一些数据库表。扩展是基于extbase的。

查询总是什么都不返回,只有数据存在。

我试过这个:

代码语言:javascript
复制
$query = $this->createQuery();
$query->statement('SELECT * FROM `my_table`
    WHERE field = ? ORDER BY date DESC LIMIT 1',
    array($condition));

$results = $query->execute();

这是:

代码语言:javascript
复制
$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以查看bug所在的位置?

我查看了一些扩展的持久化类,但没有找到任何线索。

编辑:对于那些有兴趣的人。我找到了一个“解决方案”。

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

代码语言:javascript
复制
echo $query->getStatement()->getStatement();

它不能取代占位符。但是您可以使用此方法获得变量。

代码语言:javascript
复制
var_dump($query->getStatement()->getBoundVariables());

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-10-26 10:37:06

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

通常,您需要在buildQuery(array $sql)方法(*)的末尾-就在return $statement;前面的代码

代码语言:javascript
复制
if (in_array("your_table_name", $sql['tables'])) {
    var_dump($statement);
    print_r($statement);
}

(*)类别档案:

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

6.2.x ..。

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

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2014-10-14 19:23:10

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

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

代码语言:javascript
复制
$queryParser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbQueryParser');
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->parseQuery($query));

对于TYPO3 8.7+,请使用以下代码:

代码语言:javascript
复制
$queryParser = \TYPO3\CMS\Core\Utility\GeneralUtilityGeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser::class);
$doctrineQueryBuilder = $queryParser->convertQueryToDoctrineQueryBuilder($query);
$doctrineQueryBuilderSQL = $doctrineQueryBuilder->getSQL();
$doctrineQueryBuilderParameters = $doctrineQueryBuilder->getParameters();
票数 6
EN

Stack Overflow用户

发布于 2014-11-08 12:41:36

一个简单的方法是使用php“Typo3 ()”方法,而无需更改任何核心代码,也不会在任何论坛中提到:

代码语言:javascript
复制
$result = $query->execute();
echo (serialize($result));

在结果对象中,可以找到SQL查询(“语句;”.)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13084863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档