Hello, World!!

むずかしいことはかけません

データを複数の条件で絞り件数を指定して表示したい場合

例えばあるデータを様々な条件で取得し、件数を指定して表示したい場合

以下の条件でバナーを表示させるとします。

公開ステータスの順番の優先順位
1. 順番指定の番号が若い順
2. 更新日時順
3. 登録日順
公開されているデータが6件を超えた場合、上記順番をもとに6件以上は非表示とする

ソースコード

$banners = Banner::orderByRaw('number IS NULL ASC')
            ->orderByRaw('number ASC, updated_at DESC, created_at DESC')
            ->latest('id')
            ->where('status', config('const.bannerStatus.open'))
            ->take(6)
            ->get();

それぞれの絞り込みの役割

Banner::orderByRaw('number IS NULL ASC')

`number IS NULL ASC` としないと、numberを昇順(asc)でorderbyしたときにnullが先頭に来てしまいます。
これはMySQLの仕様らしいです。

ORDER BY を実行する場合、NULL 値は ORDER BY ... ASC では最初に表示され、ORDER BY ... DESC では最後に表示されます。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 3.3.4.6 NULL 値の操作より

->orderByRaw('number ASC, updated_at DESC, created_at DESC')
  • 表示順番の昇順
  • 更新日の降順
  • 作成日の降順

の潤で表示させます。

->latest('id')

IDの若い順から表示します。

->where('status', config('const.bannerStatus.open'))

バナーのステータスが「公開」のものを表示します。

->take(6)

データを6件取得します。