9

私は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永続クラスを調べましたが、手がかりが見つかりませんでした

編集:興味のある人のために..私は「解決策」を見つけました。

statement()メソッドを使用してクエリを作成する場合は、この関数を使用してクエリを出力できます。

echo $query->getStatement()->getStatement();

プレースホルダーを置き換えるものではありません。ただし、このメソッドを使用して変数を取得できます

var_dump($query->getStatement()->getBoundVariables());

これは、extbase拡張機能を編集せずに、私が見つけた最高のソリューションです。

4

8 に答える 8

6

TYPO3 6.2では、ExtbaseDebuggerUtilityを使用してクエリをデバッグすることができます。

$ 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));
于 2014-10-14T19:23:10.710 に答える
5

このスニペットを確認してください。使い勝手はよくありませんが、非常に役立ちます。

一般に、このコードはbuildQuery(array $sql)メソッドの最後(*)に必要です-直前return $statement;

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 ver .: 6.x:typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php

6.2.xでは..。

メソッド内で試すことができ\TYPO3\CMS\Core\Database\DatabaseConnection::exec_SELECTqueryます。$queryをフェッチした後に条件を追加するだけです(トリムは重要です!):

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
于 2012-10-26T10:37:06.703 に答える
3

Typo3コアコードを変更せず、これまでフォーラムで言及されていない簡単な方法は、phpの「serialize()」メソッドを使用することです。

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

結果オブジェクトには、SQLクエリ( "statement;" ...)があります。

于 2014-11-08T12:41:36.513 に答える
2

biesiorsの回答の改善:

BuildQuery()を呼び出した後、Extbaseが一部のプレースホルダーを置き換えるため、$ this-> replacePlaceholders($ sql、$ parameters、$ tableName);getObjectDataByQuery()の直後にデバッグ出力を配置することをお勧めします。

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

また、var_dump()の代わりにdebug()を使用することをお勧めします。
[ファイル:typo3\sysext\extbase\Classes\Persistence\Generic\Storage\Typo3DbBackend.php。バージョン6.1の339行目]:

于 2013-06-25T17:52:21.987 に答える
1
$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」を書き込む必要があります

于 2015-06-16T12:13:18.617 に答える
0

$ _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>');
    }
于 2014-03-14T15:58:51.647 に答える
0

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れ、2番目のパラメーターを失いました。

于 2014-05-23T11:54:08.260 に答える
0

これを「SYS」配列の下のtypo3conf/LocalConfiguration.phpファイルに設定することをお勧めします

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

次に、クエリに意図的に間違ったフィールド名を書き込んでから、コードを実行します。これにより、最後のクエリがエラーで実行されたことが示されます。

于 2015-06-15T06:42:02.217 に答える