概要
MySQLではnull許可のカラムでORDER BYすると、nullの行が先に取り出される。
例えばLaravelでHoge::orderBy('score', 'asc')->get()
とすると、scoreがnullの行が先に取り出され、その後にscoreがnullではない行が昇順で取り出される。
nullを後ろにする方法
Hoge::orderByRaw('score is null asc, score asc')
とすると、scoreがnullではない行が先、nullの行が後に取り出される。
※ Hoge::orderByRaw('score is null asc')
のように解説しているサイトもあるが、これだとnullは後ろになるが、なぜかscore
がうまくソートされないことがある。
⇒もし詳しい人がいましたら、コメントください。
中間テーブルの場合
中間テーブルのソートにはorderByPivotメソッドを使うが、orderByPivotRawメソッドは用意されていない。
よって、orderByRawメソッドを使ってソート対象カラムを直接指定する。
$this->belongsToMany(Hoge::class)->withPivot()->orderByRaw('score is null asc, score asc')
;