Hallo zusammen,
falls ihr auch hin und wieder mit dem Query builder arbeitet und ihr das sich daraus ergebende SQL direkt testen können möchtet, ohne erst alle Parameter-Patzhalter :dcValue1
bis :dcValue99
ersetzen zu müssen, dann könnte auch für euch die folgende kleine Methode nützlich sein:
<?php
declare(strict_types=1);
namespace VendorName\Sitepackage\Utility;
use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Core\Utility\DebugUtility;
class QueryUtility
{
/**
* @param QueryBuilder $queryBuilder
* @param string $header
*/
public static function debugSQL(QueryBuilder $queryBuilder, string $header = 'Debug'): void
{
$sql = $queryBuilder->getSQL();
$params = $queryBuilder->getParameters();
foreach ($params as $param => $value) {
$value = match (gettype($value)) {
'array' => implode(',', $value),
'string' => "'" . $value . "'",
default => (string)$value,
};
$sql = str_replace(':' . $param, $value, $sql);
}
DebugUtility::debug($sql, $header);
}
}
Also statt dir den rohen SQL-Command mit Platzhaltern und den Parametern debuggen zu lassen per:
DebugUtility::debug($queryBuilder->getSQL());
DebugUtility::debug($queryBuilder->getParameters());
erhältst du mit dieser Funktion
QueryUtility::debugSQL($queryBuilder);
einen fertigen SQL-Befehl, den du 1:1 z.B. in PhpMyAdmin ausführen kannst.
Falls euch noch irgendwelche Datentypen auffallen, die für Parameter vor kommen können und die hier noch nicht korrekt in den Query-String eingesetzt werden, würde ich mich über Verbesserungsvorschläge freuen.
Aktuell werden Array-Werte als Komma-separierte Liste, String-Werte in einfachen Anführungszeichen und alle anderen Werte einfach direkt String-konvertiert eingesetzt. Für meine bisherigen Debugging-Zwecke hat das so ausgereicht aber vielleicht gibt es ja noch andere Fälle, die ich bisher nicht auf dem Schirm hatte.
Viel Spaß beim SQL/QueryBuilder-Debugging!