使用多个参数对对象进行排序 - 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 个分页表进行排序