Datenbankabfragen in TYPO3 debuggen

So kannst du Datenbankabfragen von einer Query, sei es über die Repository oder über den QueryBuilder, ausgeben und kontrollieren.

Copy & Paste Vorlagen

Eine TYPO3 Query ausgeben

$objectManager = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\ObjectManager::class);
$queryParser = $objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser::class); 
$parameters = $queryParser->convertQueryToDoctrineQueryBuilder($query)->getParameters();
$sql = $queryParser->convertQueryToDoctrineQueryBuilder($query)->getSQL();
    
foreach($parameters as $placeholder => $value)
{
  $sql = preg_replace('/:' . $placeholder . '/', $value, $sql, 1);        
}
        
var_dump($sql);

Ein TYPO3 Statement ausgeben

$statement = $query->getStatement()
$boundVariables = $statement->getBoundVariables();
$completeStatement = $statement->getStatement();
            
foreach($boundVariables as $value)
{
  if (!is_array($value))
  {
    $completeStatement = preg_replace("#\?#", "'" . $value . "'", $completeStatement, 1);
  }else
  {
    $completeStatement = preg_replace("#\?#", "'" . implode(',', $value) . "'", $completeStatement, 1);
   }
}
            
var_dump($completeStatement);

Erläuterungen

Extbase besitzt ein sehr hohen Abstraktionslevel, dass heisst man muss sehr selten SQL Anweisungen schreiben. In der Regel nutzt man Klassen. In diesem Fall die Repository oder den QueryBuilder. Dementsprechend weiß man nicht exakt, wie die SQL Anweisung, die letztenendes abgesetzt wird, aussieht.
Manchmal will man jedoch genau diese Information haben.

Wie können wir also die SQL Anweisung uns ausgeben lassen?

In der Repository konfiguriert man über das Query - Objekt die Datenbankabfrage.

$query = $this->projectRepository->createQuery();
$query->matching(
  $query->logicalAnd(
    $query->equals('name', $name)
  )
);

Um diese SQL Anweisung auszugeben, müssen wir den Typo3DbQueryParser nutzen.

Man kann jedoch auch SQL Anweisungen formulieren. Das geht ebenfalls über das Query - Objekt und der statement - Methode:

$query = $this->projectRepository->createQuery();
$query->statement('SELECT * FROM project WHERE name = ?', [$name]);

Um diese SQL Anweisungen sich vollständig mit Parameter ausgeben zu lassen, kann man sich direkt die SQL Anweisungen mit Platzhaltern und die Parameterliste ausgeben lassen und diese beiden Informationen kombinieren.