我想从我的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扩展
在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)
检查这个片段,虽然使用起来不太舒服但它有很大帮助:
一般来说,你需要在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/sysext/extbase/Classes/Persistence/Storage/Typo3DbBackend.phptypo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php您可以在\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)