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