【问题标题】:Select records at random using extbase's QueryBuilder使用 extbase 的 QueryBuilder 随机选择记录
【发布时间】:2019-02-12 14:55:33
【问题描述】:

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

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

举个例子 (仅随机选择三个人并将他们传递给一个视图)

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

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

【问题讨论】:

    标签: typo3 extbase typo3-8.x


    【解决方案1】:

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

    在此 QueryBuilder 上,您可以使用 addSelectLiteral 将 RAND() 函数插入 DB 查询。但是您必须确保您的数据库软件支持此功能,因为 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);
    

    【讨论】:

    • 与我在 10.4.8 (1/1) ArgumentCountError Too few arguments to function TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper::__construct(), 0 passed in /html/typo3/typo3_src-10.4.8/typo3/sysext/core/Classes/Utility/GeneralUtility.php on line 3423 and at least 7 expected987654325@ 中遇到错误的方式相同
    【解决方案2】:

    我认为 TYPO3、Fluid 或 QueryBuilder 中没有内置的方式来执行此操作。我解决它的方式取决于总共有多少条记录。

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

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

    【讨论】:

      【解决方案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} 数组中的随机单个新闻。

      【讨论】:

        猜你喜欢
        • 2011-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-31
        • 2015-01-26
        相关资源
        最近更新 更多