データを複数の条件で絞り件数を指定して表示したい場合
例えばあるデータを様々な条件で取得し、件数を指定して表示したい場合
以下の条件でバナーを表示させるとします。
公開ステータスの順番の優先順位 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件取得します。