doctrine-dbal Beispiel

Für mein Blog brauchte ich die 10 meistgenutzten Tags (tag) und dazu die Anzahl der jeweiligen Blogeinträge (entry).  Die Gelegenheit habe ich genutzt, mich mit doctrine-dbal vertraut zu machen, da mit TYPO3 9 dann das gute, und von mir viel genutzte, TYPO3_DB nicht mehr genutzt werden kann. 

Man definiert zunächst folgende Klassen die man nutzen möchte: 

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

Und dann gibt es meine Funktion findMostUsed, die mit Angabe des Parameters Limit die X meistgenutzten Tags holt, inklusive Entrycount: 

public function findMostUsed($limit){
    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_ophiblog_domain_model_tag');
    $queryBuilder->select('tx_ophiblog_domain_model_tag.uid', 'tx_ophiblog_domain_model_tag.name')
        ->addSelectLiteral(
            $queryBuilder->expr()->count('tx_ophiblog_domain_model_tag.uid', 'count')
        )
        ->from('tx_ophiblog_domain_model_tag')
        ->leftJoin('tx_ophiblog_domain_model_tag', 'tx_ophiblog_entry_tag_mm', 'm',
            $queryBuilder->expr()->eq(
                'm.uid_foreign',
                'tx_ophiblog_domain_model_tag.uid'
            ))
        ->where('1')
        ->groupBy('tx_ophiblog_domain_model_tag.uid')
        ->setMaxResults($limit)
        ->orderBy('count', 'desc');

    $statement = $queryBuilder->execute();
    $data = array();
    while($row = $statement->fetch()){
        $data[] = $row;
    }
    return $data;
}

Ob ein Iterieren durch $statement so wirklich notwendig ist, wird sich noch zeigen.

Wer auch das Problem hat, künftig TYPO3_DB migrieren zu müssen, wirft am besten einen Blick auf diese Seite. Die behandelt zwar nur die Basics, ist aber ein guter Anfang. 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.