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.