T3 Campus T3 Campus

Der TYPO3 Querybuilder

Um in TYPO3 manuelle Datenbankabfragen zu erstellen, gibt es den Querybuilder. Darüber lässt sich das ganze CRUD Spektrum umsetzen.

In TYPO3 lassen sich Datenbankabfragen im MVC Modell über die Repository umsetzen oder manuell über den Querybuilder. Der Querybuilder ist dann sinnvoll, wenn man Datenbankabfragen erstellen möchte zu Tabellen die kein Model besitzen oder wenn komplexere Datenbankabfragen nötig sind. Denn über den Querybuilder lassen sich INNER und LEFT JOINS ebenfalls realisieren.

Alles beginnt mit der Instanzierung des Querybuilders, dass in jeder Klasse so umgesetzt werden kann. D.h. nicht nur in einer Repository, sondern auch in einem Controller, ViewHelper oder eigenen PHP Klasse. Es werden folgende Namespaces benötigt:

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Connection;

Dann instanzieren wir ein neues QueryBuilder Objekt:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('pages')->createQueryBuilder();

Wobei pages hier der Name der Datenbanktabelle ist, die man als Haupttabelle selektiert. Du kannst hier den Namen jeder existierenden Datenbanktabelle einfügen.

Danach können wir eine SELECT, UPDATE oder DELETE Anweisung mit dem Querybuilder beschreiben.

SELECT - Anweisung

Suche eine Seite über die ID

$queryBuilder
  ->select('*')
  ->from('pages')
  ->where(
    $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(42, \PDO::PARAM_INT))
  );

Suche ein Inhaltselement über Titel und CType

$queryBuilder
  ->select('*')
->from('tt_content')
->where(
  $queryBuilder->expr()->eq('header', $queryBuilder->createNamedParameter('Lorem Ipsum')),
  $queryBuilder->expr()->eq('CType', $queryBuilder->createNamedParameter('list'))
);

Eine ODER Verknüpfung kannst du mit orWhere erzielen

$queryBuilder
 ->select('*')
 ->from('tt_content')
 ->where(
   $queryBuilder->expr()->eq('header', $queryBuilder->createNamedParameter('Lorem Ipsum')), 
   $queryBuilder->expr()->eq('CType', $queryBuilder->createNamedParameter('list')) 
 )->orWhere(
   $queryBuilder->expr()->eq('header', $queryBuilder->createNamedParameter('Lorem Ipsum')),
   $queryBuilder->expr()->eq('CType', $queryBuilder->createNamedParameter('uploads')) 
 );

Auch INNER und LEFT Joins sind möglich

$queryBuilder
 ->select('*')
 ->from('tt_content')
 ->join(
    'tt_content',
    'pages',
    'pages',
    $queryBuilder->expr()->eq('tt_content.pid', $queryBuilder->quoteIdentifier('pages.uid')
  )
  ->where(
    $queryBuilder->expr()->eq('pages.uid', $queryBuilder->createNamedParameter(42, \PDO::PARAM_INT))
  );
$queryBuilder
 ->select('tx_news_domain_model_news.*', 'sys_category.*')
 ->from('tx_news_domain_model_news')
 ->leftJoin(
     'tx_news_domain_model_news',
     'sys_category_record_mm',
     'cat_mm',
     $queryBuilder->expr()->eq('tx_news_domain_model_news.uid', $queryBuilder->quoteIdentifier('cat_mm.uid_foreign')
   )
  ->leftJoin(
     'cat_mm',
     'sys_category',
     'sys_category',
     $queryBuilder->expr()->eq('sys_category.uid', $queryBuilder->quoteIdentifier('cat_mm.uid_local') )
  ->where(
     $queryBuilder->expr()->eq('cat_mm.tablenames', $queryBuilder->createNamedParameter('tx_news_domain_model_news')),
     $queryBuilder->expr()->eq('cat_mm.fieldname', $queryBuilder->createNamedParameter('categories'))
   );

Um eine SELECT Anweisung auszuführen, muss man abschließend die execute() - Funktion aufrufen:

$result = $queryBuilder->executeQuery();

Hier wird die formulierte Datenbankabfrage kompiliert und ausgeführt. Der Rückgabewert ist ein Objekt von \Doctrine\DBAL\Result. Die Ergebnisse lassen sich dann beispielsweise mit diesen Methoden auslesen:

$result->fetchOne() - Liefert den Wert der ersten Spalte des ersten Ergebnisses zurück

$result->fetchAssociative() - Liefert die nächste Zeile des Ergebnisses als assoziatives Array zurück

$result->fetchAllAssociative() - Liefert alle Ergebnisse als assoziatives Array zurück.

UPDATE - Anweisung

Eine UPDATE Anweisung, um vorhandene Datensätze zu aktualisieren, formuliert man mit dem QueryBuilder wie folgt:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');
$queryBuilder
   ->update('tt_content')
   ->where(
      $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus'))
   )
   ->set('bodytext', 'peter')
   ->executeStatement();

Um mehrere Felder zu aktualisieren, muss man die Methode: set() öfter aufrufen, das geht zum Beispiel wie folgt:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');
$queryBuilder
 ->update('tt_content')
 ->where( $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus'))
);

$fieldsToUpdate = [
  'header' => 'Lorem Ipsum',
  'bodytext' => 'Peter'
];

foreach($fieldsToUpdate as $fieldName => $value) {
  $queryBuilder->set($fieldName, $value);
}

$queryBuilder->executeStatement();

Die UPDATE Anweisung führt man dann executeStatement() aus:

$queryBuilder->executeStatement()

DELETE- Anweisung

Die DELETE Anweisung ist mit dem QueryBuilder sehr schnell geschriebe und ähnelt der UPDATE Anweisung:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content');
$affectedRows = $queryBuilder
   ->delete('tt_content')
   ->where(
      $queryBuilder->expr()->eq('bodytext', $queryBuilder->createNamedParameter('klaus'))
   )
   ->executeStatement();

Du siehst der QueryBuilder ist ein mächtiges und ein einfache zu bedienendes Tool in TYPO3 um manuelle Datenbankabfragen zu formulieren. Anders wie in anderen Content Management Systemen muss man in TYPO3 in den allermeisten Fällen keine eigene MySQL Anweisungen schreiben. Das ist einer der Gründe, wieso TYPO3 sicherer ist als andere Content-Management-Systeme.

Bereit mehr zu lernen?

Dann komme in meine TYPO3 Onlineschule

Als Mitglied des T3 Campus für TYPO3 Schulungen erhältst du eine einzigartige Lernplattform, um professionelle Webseiten mit TYPO3 zu erstellen. Egal, ob du ein Einsteiger, Umsteiger oder bereits erfahren bist – hier findest du die passenden Lernvideos für dich.

Kevin Chileong Lee

Gründer vom T3 Campus, TYPO3 Experte mit 10+ Jahren Erfahrung, TYPO3 Liebhaber.

Ich helfe dir dabei, deine Projekte in TYPO3 umzusetzen.

Insbesondere für TYPO3 Einsteiger biete ich zahlreiche kostenfreie Tutorials und kostenpflichtige Kurse rund um TYPO3 an.
Damit kannst du in wenigen Tagen auch ohne Vorkenntnisse deine erste TYPO3 Webseite erstellen und Erweiterungen programmieren.

Auf meinem YouTube-Kanal findest du viele praktische Beispiele und Videotutorials als auch allgemein Videos zu diversen TYPO3 Themen.

Neber den TYPO3 Tutorials und Kopiervorlagen, schreibe ich auch Artikel auf meinem Blog über diverse Themen und Fragen, die die meisten TYPO3 Einsteiger, haben.

Falls du ein TYPO3 Coaching suchst, dann stehe ich dir in einer 1:1 Trainingssession zur Verfügung.

Wenn du auf dem Laufenden sein möchtest über meine Projekte, dann abonniere den Newsletter.