TYPO3:分页时出现性能问题

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

我目前正在根据我创建的扩展程序来构建某种视频频道。它由视频和包含视频的播放列表组成(显然)。我必须创建一个页面,其中包含按类别列出的视频和播放列表。您还可以按日期对这些项目进行排序。最终,页面以无限滚动分页,该滚动应加载21到21的项目。为此,我在视频和播放列表存储库上都创建了一个“ findByCategory”函数,该函数非常简单:

$query = $this->createQuery();
    return $query->matching($query->equals('categorie.uid',$categoryUid))->execute()->toArray();

一旦我请求了所需的项目,我会将它们合并为一个数组并进行分类。这是我的控制器显示动作:

    if ($this->request->hasArgument('sort'))
        $sort = $this->request->getArgument('sort');
    else
        $sort = 'antechrono';
    //Get videos in repositories
    $videos = $this->videoRepository->findByCategorie($categorie->getUid());
    $playlists = $this->playlistRepository->findByCategorie($categorie->getUid());
    //Merging arrays then sort it
    if ($videos && $playlists)
        $result = array_merge($videos, $playlists);
    else if ($videos)
        $result = $videos;
    else if ($playlists)
        $result = $playlists;
    if ($sort == "chrono")
        usort($result, array($this, "sortChrono"));
    else if ($sort == "antechrono" || $sort == null)
    {
        usort($result, array($this, "sortAnteChrono"));
        $sort="antechrono";
    }
    $this->view->assignMultiple(array('categorie' => $categorie, 'list' => $result, 'sort' => $sort));

这是我的观点:

<f:widget.paginate objects="{list}" as="paginatedList" configuration="{addQueryString: 'true', addQueryStringMethod: 'GET,POST', itemsPerPage: 21}">
    <div class="videos row">
        <f:for each="{paginatedList}" as="element">
            <f:render partial="Show/ItemCat" arguments="{item: element}"/>
        </f:for>
    </div>
</f:widget.paginate>

局部渲染显示了包括用作封面的图片的内容。因此,我至少在视图中需要此关系。

这很好,并且只显示所请求类别中的项目。不幸的是,我遇到了一个巨大的性能问题:我试图显示一个包含3000多个记录的类别,并且加载大约需要一分钟。这是一个little bit长。

通过f:调试我的list变量,我发现它包含所有记录,即使通过它也不应该这样(这是分页的重点...)。因此,第一个问题是:分页方式有问题吗?

我试图通过启用rawQuery东西($ query-> execute(true))来简化请求:我获得了更好的性能,但是我无法获得图片的链接(在我看来,我得到了1或0,但不是图片的uid ...)。第二个问题:是否有解决此问题的方法?

我希望我的描述足够清楚。感谢您的帮助:-)

pagination typo3 typo3-9.x
2个回答
0
投票

执行查询时,它实际上不会从数据库中获取数据,直到访问结果为止。如果分页小部件获得查询结果,它将为查询添加限制和偏移量,然后从数据库中获取数据,因此您将仅获得页面上显示的记录。

在您的情况下,您在toArray()之后添加了execute(),这将访问结果,因此将从数据库中获取数据并获得所有记录。我能想到的最好的解决方案是将2个表合并为1个表,这样您就可以通过单个查询进行操作,而不必在PHP中进行合并和排序。


0
投票

只要在查询后对数据进行排序,就必须处理所有数据(请求所有记录,尤其是解析所有关系)。

尝试对查询本身中的数据进行排序(order by),因此您可以将数据限制为仅当前'页面'(limit <offset>,<number>)所需的那些记录。在这里,使用joinlimit进行复杂的查询可能比使用PHP中的完整查询和过滤要快。

© www.soinside.com 2019 - 2024. All rights reserved.