Twig foreach group by date

时间:2014-05-27 18:41:36

标签: symfony group-by twig

我有一张名为'match'的足球比赛表。在该表中有一个字段'kickoff',它是匹配开始时的datetime-column。使用以下代码,我可以从表中获得所有匹配项。

$matches = $em->createQueryBuilder()
        ->select('m')
        ->from('FootballWcBundle:Matches', 'm')
        ->addOrderBy('m.kickoff', 'ASC')
        ->getQuery()
        ->getResult();

return $this->render('FootballWcBundle:Page:matches.html.twig', array(
        'matches' => $matches
));

现在我想在屏幕上显示按日期分组的匹配项。 像这样:

2014年12月12日

MATCH1

MATCH2

14-12-2014

MATCH3

match4

match5

有没有办法让Twig知道如何通过启动列进行分组,还是有另一种方法可以做到这一点?

2 个答案:

答案 0 :(得分:7)

你可以这样做:

    {% set date = null %}
    {% for match in matches %}
        {% if date != match.kickoff %}
            {% set date = match.kickoff %}
            <h3>{{ date }}</h3>
        {% endif %}

        <p>{{ match.name }}</p>
    {% endfor %}

这样,你将第一个日期设置为null,然后迭代所有匹配并写一个带有名称的'p'标签(我认为匹配有一个名称来做例子),并且当日期为匹配更改,你写一个'h3'标签与匹配的日期。由于在第一次迭代中将日期设置为null,因此第一个日期将为write。

答案 1 :(得分:0)

有一个源自COBOL的受控中断算法。它可以在您的情况下使用,但您必须在TWIG中重写它。我在JAVA成功使用了它。

下面是受控中断算法的C / C ++实现。看看并根据你的情况使用这个原则。

#include <iostream>
#define LMARG "          "
#define UNDERLN "=============="

using namespace std;

void displayTable(int table[],short size);
//
// Purpose: Illustrated a controlled break algorithm
// Given an ordered sequence of data members, display with summary
//
int main(void)
{
    int table[] = {10,12,12,30,30,30,30,40,55,60,60,60};

    displayTable(table,sizeof(table)/sizeof(int));
    fflush(stdin);
    getchar();
    return 0;
}


void displayTable(int table[],short size)
{
    int currentKey,lastKey;
    int i, categoryCount,groupTotal;

    currentKey = lastKey = table[0];
    groupTotal = categoryCount = i = 0;
    while (i < size)
    {
        if (currentKey == lastKey)
        {
            groupTotal += table[i];
            categoryCount++;
            cout << LMARG <<  table[i] << endl;
        }
        else
        {
            cout << LMARG <<  UNDERLN << endl;
            cout << "Total:       " << groupTotal << endl;
            cout << "Croup Count: " <<  categoryCount << endl << endl;
            cout << LMARG <<  table[i] << endl; // start of next group
            groupTotal = currentKey,categoryCount = 1;
            fflush(stdin);getchar();
        }
        lastKey = currentKey;
        currentKey = table[++i]; // get next key
    } // while
    cout << LMARG <<  UNDERLN << endl; // last group summary
    cout << "Total:       " << groupTotal << endl;
    cout << "Croup Count: " <<  categoryCount << endl << endl;
}