请帮助我。我需要显示搜索次数最多的 4 个单词的列表。我正在向表“index_stat_word”(indexed_search 扩展)发出查询请求。但结果是空的。
我的代码在这里:
<?php
declare(strict_types=1);
namespace Vendor\MySitePackage\Domain\Repository;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Utility\GeneralUtility;
final class MostSearchedRepository
{
private ConnectionPool $connectionPool;
private const TABLE_NAME = 'index_stat_word';
public function __construct(ConnectionPool $connectionPool)
{
$this->connectionPool = $connectionPool;
}
public function findMostUsedWords(int $limit = 4): array
{
$queryBuilder = $this->connectionPool
->getQueryBuilderForTable(self::TABLE_NAME);
$queryBuilder->getRestrictions()
->removeAll()
->add(GeneralUtility::makeInstance(DeletedRestriction::class));
$queryBuilder
->select('word', 'COUNT(word) AS word_count')
->from(self::TABLE_NAME)
->groupBy('word')
->orderBy('word_count', 'DESC')
->setMaxResults($limit);
$query = $queryBuilder->executeQuery();
return $query->fetchAllAssociative();
}
}
<?php
declare(strict_types=1);
namespace Vendor\MySitePackage\Controller;
use Vendor\MySitePackage\Domain\Repository\MostSearchedRepository;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Extbase\Mvc\View\ViewInterface;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
class MostSearchedController extends ActionController
{
protected MostSearchedRepository $mostSearchedRepository;
public function __construct(MostSearchedRepository $mostSearchedRepository)
{
$this->mostSearchedRepository = $mostSearchedRepository;
}
/**
* Action to display most searched words
*
* @param ViewInterface $view
* @return void
*/
public function showMostSearchedWordsAction(RenderingContextInterface $renderingContext)
{
$mostSearchedWords = $this->mostSearchedRepository->findMostUsedWords();
$renderingContext->getVariableProvider()->add(
'mostSearchedWords',
$mostSearchedWords
);
}
}
?>
<ul class="popular-words">
<f:for each="{mostPopularWords}" as="word">
<li>{word.word} - {word.word_count}</li>
</f:for>
</ul>
谢谢您的回答。
你的动作看起来很奇怪。试试这个:
public function showMostSearchedWordsAction(): ResponseInterface
{
$this->view->assign(
'mostSearchWords',
$this->mostSearchedRepository->findMostUsedWords()
);
return $this->htmlResponse();
}