Symfony Doctrine2:自定义orderBy子句

Symfony Doctrine2:自定义orderBy子句,symfony,doctrine-orm,Symfony,Doctrine Orm,我想获取一些按照这些条件排序和分页的事件: 在不到20公里的时间内举办活动 在不到20公里内发生的事件 20公里以外的公开赛 20公里以外的传入事件 我可以处理打开的/收到的订单,但我不能先缩短

我想获取一些按照这些条件排序和分页的事件:

  • 在不到20公里的时间内举办活动
  • 在不到20公里内发生的事件
  • 20公里以外的公开赛
  • 20公里以外的传入事件
我可以处理打开的/收到的订单,但我不能先缩短<20公里,我的查询生成器是这样的:

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();
}
这将为事件提供opened first,在查询生成器中处理<20km标准有何想法?我必须使用本机查询吗?我能把两者混合吗


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

您想要区分的是“近”和“远”事件。 你应该加上

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

我不知道这个Syntax,谢谢!这是工作,但不是在我的情况下。“距离”字段由上一个select子句计算,不能用于另一个select:(未找到列:1054“字段列表中的未知列“sclr6”)如果看不到您在代码中添加的内容,我将无法进一步帮助