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

时间:2018-01-27 21:00:25

标签: symfony sorting doctrine

我想显示由参数排序的对象列表,该参数依赖于实体的多个字段。

我创建了一个实体,让我们称它为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;
 }

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

我知道我可以用这个:

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

获取数据库中所有现有Object实例的列表,但虽然对于实验Symfony程序员来说这可能是一个相对简单的问题,但我不知道如何通过avg(field1,field2)来订购它。

1 个答案:

答案 0 :(得分: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所述。