使用extbase的QueryBuilder

时间:2019-02-12 14:55:34

标签: typo3 extbase typo3-8.x

我正在开发TYPO3版本8中的定制扩展。

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

作为一个例子 (仅随机选择三个人,然后将其传递给视图)

我的第一个操作是查看QueryBuilder并创建一个自定义查询。查看其他类似的帖子,似乎extbase的查询生成器没有带RAND功能(有充分的理由)。

最好看一下使用Fluid和迭代器viewhelper来帮助我以随机顺序显示项目吗?还是可以使用QueryBuilder来实现?

3 个答案:

答案 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}