使用extbase的QueryBuilder随机选择记录

问题描述 投票:0回答:3

我正在TYPO3版本8中进行定制扩展。

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

作为示例(随机选择三个人并将其传递给视图)

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

看看使用Fluid和iterator viewhelper帮助我以随机顺序显示项目会更好吗?或者可以使用QueryBuilder实现?

typo3 extbase typo3-8.x
3个回答
2
投票

Extbase存储库查询没有任何随机函数。至少从TYPO3 8 LTS开始的新的Doctrine Querybuilder可用于获得随机结果:https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Database/QueryBuilder/Index.html

在此QueryBuilder上,您可以使用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 Model Records,您可以使用DataMapper。

$dataMapper = GeneralUtility::makeInstance(TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper::class);
$result = $dataMapper->map(\You\Yourext\Model\Example::class, $rows);

1
投票

我不认为在TYPO3,Fluid或QueryBuilder中有这样做的方法。我解决它的方式取决于总共有多少条记录。

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

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


0
投票

我不在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} 
© www.soinside.com 2019 - 2024. All rights reserved.