通过使用多列进行复杂订购

时间:2019-02-13 12:29:29

标签: php laravel sql-order-by laravel-5.7 laravel-query-builder

我有一个足球比赛表,该表显示基于minuteextra_minute的比赛。例如:

 id |    type    | minute | extra_minute  |  reason
 1  | yellowcard |   45   | null          |   null
 2  | yellowcard |   45   |  1            |   null
 3  |   period   |   45   | null          |    HT
 4  |    goal    |   45   |  2            |   null
 5  |    goal    |   46   |  2            |   null    // this is second half
 6  |   period   |   90   | null          |    FT
 7  |    goal    |   90   |  2            |   null

订单应为

yellowcard (45)
yellowcard (45+1)
   goal    (45+2)
    HT
   goal    (46)
   goal    (90+2)
    FT

我在

之类的“匹配”中尝试了一个关系查询
public function events() {
    return $this->hasMany(Event::class)->orderBy('minute', 'asc')
                                       ->orderBy('extra_minute', 'asc');
}

但这会导致

    HT
yellowcard (45)
yellowcard (45+1)
   goal    (45+2)
   ...

使用Laravel Query Builder对所需样式进行排序的方式是什么? 我知道为什么我的查询生成器无法正常工作,但是我无法提出实现我想要的东西的方法

1 个答案:

答案 0 :(得分:1)

->orderByRaw('type = ? asc', 'period')是做到这一点的方法。

return $this->hasMany(Event::class)
            ->orderBy('minute', 'asc')
            ->orderByRaw('type = ? asc', 'period')
            ->orderBy('et_minute', 'asc');