使用 extbase 的 QueryBuilder 随机选择记录



我正在研究 TYPO3 版本 8 中的定制扩展。

在我的扩展中,我想在前端以随机顺序显示至少十个左右的结果集中的三个项目。

举个例子(随机只选择三个人,传递到一个视图(

我的第一个问题是查看QueryBuilder并创建自定义查询。查看其他类似的帖子,extbase 的查询构建器似乎没有携带 RAND 函数(有充分的理由(。

使用Fluid和迭代器视图助手来帮助我以随机顺序显示项目会更好吗?或者可以使用QueryBuilder来实现吗?

Extbase Repository Query 没有任何随机函数。至少自 TYPO3 8 LTS 以来的新 Doctrine Querybuilder 可用于获取随机结果:https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Database/QueryBuilder/Index.html

在此查询构建器上,您可以使用addSelectLiteral将 RAND(( 函数插入到数据库查询中。但是您必须确保您的数据库软件支持此功能,因为 TYPO3 DB 可以连接到任何其他可能不支持 RAND(( 的数据库软件。

使用示例:

$rows = $queryBuilder
        ->select('*')
        ->from('tx_yourext_domain_model_example')
        ->addSelectLiteral('RAND() AS randomnumber')
        ->orderBy('randomnumber')
        ->setMaxResults(3)
        ->execute()
        ->fetchAll();

若要从结果创建一些 Extbase 模型记录,可以使用 DataMapper。

$dataMapper = GeneralUtility::makeInstance(TYPO3CMSExtbasePersistenceGenericMapperDataMapper::class);
$result = $dataMapper->map(YouYourextModelExample::class, $rows);

我不认为TYPO3,Fluid或QueryBuilder中有内置方法可以做到这一点。我解决它的方法取决于总共有多少条记录。

如果只有几十个,我可能会将它们全部选中并使用 PHP shuffle 函数对它们进行随机排序,然后显示前 3 个。

如果可以有数百条或更多记录,我可能会进行计数,并在 0 和计数结果之间得到 3 个随机数。然后,您可以使用setFirstResult(随机数(和setMaxResults (1( 函数执行 3 个不同的查询。

我不在TYPO3v9中使用vhs。我使用秒和简单的数学来获得 1 个随机元素。例如,我通过以下方式从 {news} 数组中获取迭代器的随机值:

<f:variable name="sec4random" value="{f:format.date(date:'0 seconds', format:'s')}"/>
<f:variable name="count4random" value="{f:count(subject: news)}"/>
Random index for iterator: {sec4random % count4random} 

要访问具有找到索引的 newsItem,您可以添加以下内容:

 <f:variable name="newsindex" value="{sec4random % count4random}"/>
 <f:variable name="newsItem" value="{news.{newsindex}}"/>

现在 {newsItem} 包含 {news} 数组中的随机单个新闻。

最新更新