我想显示由参数排序的对象列表,该参数依赖于实体的多个字段。
我创建了一个实体,让我们称它为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)来订购它。
答案 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所述。