Doctrine2:自定义orderBy子句

时间:2014-12-01 11:17:57

标签: symfony doctrine-orm

我想获取一些事件,按照这些标准排序和分页:

  • 在不到20公里的时间内开启活动
  • 小于20公里的传入事件
  • 超过20公里的活动
  • 超过20公里的传入事件

我可以处理打开/收到的订单,但我无法削减<首先是20km,这是我的查询构建器的样子:

public function fetchByLocation($day, $time, $latitude, $longitude, $page = 1, $itemPerPage = 10)
{
    if(!$page) {
        $page = 1;
    }

    $qb = $this->createQueryBuilder('event')
        ->select('event', 'GEO_DISTANCE(:latitude, :longitude, event.latitude, event.longitude) AS distance')
        ->setParameter('latitude', $latitude)
        ->setParameter('longitude', $longitude)
        ->where('(event.day = :day AND event.start >= :time) OR event.day > :day')
        ->setParameter('day', $day)
        ->setParameter('time', $time)
        ->addOrderBy('event.day', 'asc')
        ->addOrderBy('event.start', 'asc');


    $qb->setFirstResult(($page - 1) * $itemPerPage)
        ->setMaxResults($itemPerPage);

    return $qb->getQuery()->getResult();
}

这将提供事先打开的事件,任何想法来处理<查询构建器中的20km标准?我必须使用本机查询吗?我可以混合使用吗?

非常感谢您考虑我的要求:)

1 个答案:

答案 0 :(得分:4)

你想要的是区分"关闭"和"远"。 你应该添加

->addSelect('(CASE WHEN distance > 20 then 1 ELSE 0 END) AS is_far')
->addOrderBy('is_far ASC')