我目前正在根据我创建的扩展程序来构建某种视频频道。它由视频和包含视频的播放列表组成(显然)。我必须创建一个页面,其中包含按类别列出的视频和播放列表。您还可以按日期对这些项目进行排序。最终,页面以无限滚动分页,该滚动应加载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 ...)。第二个问题:是否有解决此问题的方法?
我希望我的描述足够清楚。感谢您的帮助:-)
执行查询时,它实际上不会从数据库中获取数据,直到访问结果为止。如果分页小部件获得查询结果,它将为查询添加限制和偏移量,然后从数据库中获取数据,因此您将仅获得页面上显示的记录。
在您的情况下,您在toArray()
之后添加了execute()
,这将访问结果,因此将从数据库中获取数据并获得所有记录。我能想到的最好的解决方案是将2个表合并为1个表,这样您就可以通过单个查询进行操作,而不必在PHP中进行合并和排序。
只要在查询后对数据进行排序,就必须处理所有数据(请求所有记录,尤其是解析所有关系)。
尝试对查询本身中的数据进行排序(order by
),因此您可以将数据限制为仅当前'页面'(limit <offset>,<number>
)所需的那些记录。在这里,使用join
和limit
进行复杂的查询可能比使用PHP中的完整查询和过滤要快。