Laravel-MySQLのORDER BYでnullを後ろにする(中間テーブルにも対応)

スポンサーリンク

概要

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');


コメント