Php 最小化从SilverStripe模板对控制器的调用

Php 最小化从SilverStripe模板对控制器的调用,php,silverstripe,templating,Php,Silverstripe,Templating,在我正在创建的应用程序中,我有新闻文章,它们有新闻标签(使用创建)。我正在使用新闻标签在每个新闻文章的侧栏中创建一个“相关新闻”小部件。我在新闻文章控制器中创建了一个RelatedArticles操作,一切都很好 但是,为了使用RelatedArticles操作,我不得不调用函数三次。这不是一个大问题,但我希望尽量减少调用对数据库进行多次调用的函数的次数 下面是我的RelatedNewsModule.ss模板文件的精简版本: // First call to check if there are

在我正在创建的应用程序中,我有
新闻文章
,它们有
新闻标签
(使用创建)。我正在使用
新闻标签
在每个
新闻文章
的侧栏中创建一个“相关新闻”小部件。我在
新闻文章
控制器中创建了一个
RelatedArticles
操作,一切都很好

但是,为了使用
RelatedArticles
操作,我不得不调用函数三次。这不是一个大问题,但我希望尽量减少调用对数据库进行多次调用的函数的次数

下面是我的
RelatedNewsModule.ss
模板文件的精简版本:

// First call to check if there are related articles
<% if $RelatedArticles %>

    // second call to get the array
    <% loop $RelatedArticles() %>
        ...
    <% end_loop %>

    // third call to check if there are more than one so we need navigation
    <% if $RelatedArticles.Count > 1 %>
            ... navigation markup
    <% end_if %>

<% end_if %>
//第一次调用检查是否有相关文章
//第二次调用以获取数组
...
//第三次呼叫检查是否有多个,因此我们需要导航
1 %>
... 导航标记
我想调用该函数一次,也许可以使用SilverStripe模板中的属性,该模板将引用两个检查和文章数组。然而,我不知道该怎么做


处理这种情况的最佳方法是什么?

如评论中所述,SilverStripe应该只调用数据库一次,并为接下来的两次调用缓存
RelatedArticles
结果

为了进一步缓存查询,我们可以使用缓存部分模板

<% cached 'RelatedArticles', $ID, $List('RelatedArticles').max('LastEdited'), $List('RelatedArticles').count() %>
    <% if $RelatedArticles %>

        // second call to get the array
        <% loop $RelatedArticles %>
            ...
        <% end_loop %>

        // third call to check if there are more than one so we need navigation
        <% if $RelatedArticles.Count > 1 %>
            ... navigation markup
        <% end_if %>

    <% end_if %>
<% end_cached %>

//第二次调用以获取数组
...
//第三次呼叫检查是否有多个,因此我们需要导航
1 %>
... 导航标记

正如评论中所说,SilverStripe应该只调用数据库一次,并在接下来的两次调用中缓存
相关文章的结果

为了进一步缓存查询,我们可以使用缓存部分模板

<% cached 'RelatedArticles', $ID, $List('RelatedArticles').max('LastEdited'), $List('RelatedArticles').count() %>
    <% if $RelatedArticles %>

        // second call to get the array
        <% loop $RelatedArticles %>
            ...
        <% end_loop %>

        // third call to check if there are more than one so we need navigation
        <% if $RelatedArticles.Count > 1 %>
            ... navigation markup
        <% end_if %>

    <% end_if %>
<% end_cached %>

//第二次调用以获取数组
...
//第三次呼叫检查是否有多个,因此我们需要导航
1 %>
... 导航标记

循环中不需要括号。通常它应该缓存查询,因此如果$RelatedArticles
循环$RelatedArticles
,至少对于$has\u many或$many\u many关系。在您的情况下,您将在操作中手动缓存它。看也对哦。我把支架拆下来看看。根据缓存,我问这个问题的原因是因为我注意到在调试它时,var_dump被调用了3次。那么,您需要检查DB是否被查询了3次,或者它是否被缓存了。只需将?showqueries=1放入您的URL即可。请参阅@rath3r始终防止不必要查询的最简单方法是使用聚合的部分缓存。这样,它只在需要失效时才会执行这些操作。例如,将昂贵的查询缓存到它自己的块中,检查计数,或者您希望通过什么值对其进行聚合。我当然不会使用db连接来检查这些值,但是它们在sql中运行起来非常快。获取完整数据并操纵显示通常会导致性能下降。循环中不需要括号。通常它应该缓存查询,因此如果$RelatedArticles和
循环$RelatedArticles
,至少对于$has\u many或$many\u many关系。在您的情况下,您将在操作中手动缓存它。看也对哦。我把支架拆下来看看。根据缓存,我问这个问题的原因是因为我注意到在调试它时,var_dump被调用了3次。那么,您需要检查DB是否被查询了3次,或者它是否被缓存了。只需将?showqueries=1放入您的URL即可。请参阅@rath3r始终防止不必要查询的最简单方法是使用聚合的部分缓存。这样,它只在需要失效时才会执行这些操作。例如,将昂贵的查询缓存到它自己的块中,检查计数,或者您希望通过什么值对其进行聚合。我当然不会使用db连接来检查这些值,但是它们在sql中运行起来非常快。获取完整数据并操纵显示是导致性能正常下降的原因之一。