使用多个参数对对象进行排序 - symfony2

Posted

技术标签:

【中文标题】使用多个参数对对象进行排序 - symfony2【英文标题】:sort objects with several parameters - symfony2 【发布时间】:2018-01-27 21:00:24 【问题描述】:

我想显示一个按参数排序的对象列表,该参数取决于实体的几个字段。

我创建了一个实体,比如我们称之为 Object,它有一个 id 和 2 个整数作为字段。我使用 Symfony 2 和 Doctrine 作为 ORM。

  `/**
 * Object
 *
 * @ORM\Table(name="object")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ObjectRepository")
 */
 class Object
 
     /**
      * @var int
      *
      * @ORM\Column(name="id", type="integer")
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      */
     private $id;

     /**
      * @var int
      *
      * @ORM\Column(name="field1", type="int")
      */
     private $field1;

     /**
      * @var int
      *
      * @ORM\Column(name="field2", type="int")
      */
     private $field2;
 

现在我想从我的数据库中获取前 5 个 Object 实例,例如按 field1 和 field2 之间的平均值排序,以便在树枝模板中显示它们。

我知道我可以用这个:

$list = $this->getDoctrine()->getRepository('AppBundle:Object')->findAll();

获取数据库中所有现有 Object 实例的列表,但尽管对于经验丰富的 Symfony 程序员来说这可能是一个相对简单的问题,但我不知道如何通过 avg(field1,field2) 对其进行排序。

【问题讨论】:

这是简单的正向 php 排序:php.net/manual/de/function.usort.php 【参考方案1】:

您可以在存储库中创建一个方法,该方法构建一个包含特殊 ORDER BY 子句的查询,并将结果数限制为 5。它可能如下所示:

class ObjectRepository extends \Doctrine\ORM\EntityRepository

    /* ... other methods ... */

    public function retrieveTopObjects($limit = 5)
    
        $qb = $this->createQueryBuilder('o')->orderBy('(o.field1 + o.field2) / 2', 'DESC');
        $qb->setMaxResults($limit);
        return $qb->getQuery()->getResult();
    

如果您希望将分数与对象一起用于对实体进行排序,则需要添加$qb->addSelect('(o.field1 + o.field2) / 2 AS score'),然后使用$qb->orderBy('score', 'DESC') 而不是上面显示的表达式。

在这种情况下,您最终会得到混合结果,正如 in the documentation 所解释的那样。

【讨论】:

以上是关于使用多个参数对对象进行排序 - symfony2的主要内容,如果未能解决你的问题,请参考以下文章

按特定参数对对象列表进行排序

Symfony2 KnpPaginator 包,在我看来无法使用 2 个分页表进行排序

Symfony2,如何使用 KnpPaginatorBundle 和 QueryBuilder 传递参数排序和方向

JS对象数组多条件排序

如何按多个字段对对象数组进行排序?

如何对 Symfony2 控制器进行单元测试?