按Twig中的列值对表进行排序

时间:2015-08-19 01:56:09

标签: symfony twig

我在Twig中创建了一个方法,它将计算并显示表格中的结果。但我想根据结果列对表格进行排序

{% for island in islands %} 
        <tr>
            <td>{{ island.id }}</td>
            <td>{{ island.name }}</td>
            <td>{{ number_votes(island.id) }}</td>
        </tr>
{% endfor %}

结果

  id  name   result
  1   name1  3000
  2   name2  100
  3   name3  5000
  4   name4  90

正如您所看到的,它默认根据其id排序。如何根据其结果列进行排序?

我的枝条过滤器

public function getFunctions()
{
return array(

  new \Twig_SimpleFunction('number_votes', array($this, 'a'))
 );
 }

 public function getName()
 {
 return 'app.extension';
 }   

 public function a($id)
 {
 $qb=$this->em->createQueryBuilder();
 $qb->select('count(v.id)')
  ->from('Bundle:Voters','v')
  ->join('v.city','c')
  ->join('c.province','p')
  ->join('p.region','r')
  ->join('r.island','i')
  ->where('i.id = :x')
  ->setParameter('x',$id);
  $count = $qb->getQuery()->getSingleScalarResult(); 
  return $count;
  //I tried return sort($count)//not working
  }

我也试过

{{ number_votes(island.id)|sort }}/throws an error

我担心我必须创建另一个Twig过滤器,有什么方法可以防止这种情况吗?

1 个答案:

答案 0 :(得分:1)

您可以完全避免使用树枝过滤器并执行此类操作,以便在一个结果集中使用您的岛屿和投票计数:

    $islandsAndVotes = $qb->select('i, count(v.id) as vote_count')
        ->from('Bundle:Voters','v')
        ->join('v.city','c')
        ->join('c.province','p')
        ->join('p.region','r')
        ->join('r.island','i')
        ->groupBy('i')
        ->orderBy('vote_count', 'DESC')
        ->getQuery()
        ->getResult()
    ;

$ islandsAndVotes的每个元素将包含索引为0的Island实体和索引为1的投票计数

E.g。

foreach ($islandsAndVotes as $islandVote) {

    $island = array_shift($islandVote);
    $votecount = array_shift($islandVote);
}

在树枝上你可以使用first&amp;当您迭代结果时,last分别访问岛屿或投票计数。

{% for islandVote in islandsAndVotes %}
    {% set island = islandVotes|first %}
    {% set voteCount = islandVotes|last %}
    <tr>
        <td>{{ island.id }}</td>
        <td>{{ island.name }}</td>
        <td>{{ voteCount }}</td>
    </tr>
{% endfor %}