我正在开发TYPO3版本8中的定制扩展。
在我的扩展程序中,我要以随机顺序在前端显示三个项目,而结果集至少要有十个左右。
作为一个例子 (仅随机选择三个人,然后将其传递给视图)
我的第一个操作是查看QueryBuilder并创建一个自定义查询。查看其他类似的帖子,似乎extbase的查询生成器没有带RAND功能(有充分的理由)。
最好看一下使用Fluid和迭代器viewhelper来帮助我以随机顺序显示项目吗?还是可以使用QueryBuilder来实现?
答案 0 :(得分: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模型记录,可以使用DataMapper。
$dataMapper = GeneralUtility::makeInstance(TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper::class);
$result = $dataMapper->map(\You\Yourext\Model\Example::class, $rows);
答案 1 :(得分:1)
我认为TYPO3,Fluid或QueryBuilder中没有构建此功能的方法。我要解决的方式取决于总共有多少条记录。
如果只有几十个,我可能会全部选中它们并使用PHP shuffle
函数对它们进行随机排序,然后显示前3个。
如果可以有数百条或更多条记录,我可能会做一个计数,并得到0到计数结果之间的3个随机数。然后,您可以使用setFirstResult
(随机数)和setMaxResults
(1)函数进行3个不同的查询。
答案 2 :(得分: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}