使用資料庫時,常常會遇到某些欄位可能為空或 NULL 的情況。經常出現的一個挑戰是如何對記錄進行排序,以便具有空字段的行出現在結果集的底部,而具有非空值的行以有意義的方式排序(例如,降序)。在這篇文章中,我將透過一個實際範例向您展示如何在 Laravel 中實現這一目標。
假設您有一個活動的參與者表,每個參與者可能有也可能沒有 attend_at 時間戳,它記錄了參與者參加活動的時間。您想要列出所有參與者,並按以下方式對它們進行排序:
預設情況下,Laravel 的latest() 方法按給定列按降序對記錄進行排序。但是,它不處理某些記錄具有 NULL 或空值的情況。如果您只是使用:
return $this ->participants() ->with('user') ->latest('attended_at') ->get();
它將使用時間戳對參與者進行排序,但不會將 NULL 值移到底部。
我們可以使用 orderByRaw() 方法實作所需的排序。這允許我們使用原始 SQL 表達式編寫自訂排序邏輯。在這種情況下,我們將根據 attend_at 是否為 NULL 進行排序,然後根據 attend_at 對非 NULL 值進行降序排序。
以下是在 Laravel 中編寫此查詢的方法:
return $this ->participants() ->with('user') ->orderByRaw('attended_at IS NULL, attended_at DESC') ->get() ->map(function (ActivityParticipant $participant) { return [ 'metric_number' => data_get($participant, 'user.student_id'), 'name' => data_get($participant, 'user.name'), 'status' => data_get($participant, 'status'), 'attended_at' => data_get($participant, 'attended_at', '-'), ]; })->toArray();
然後使用map()函數將輸出格式化為所需的結構,包括student_id、name和status等字段,並將attent_at時間戳轉換為人類可讀的格式或「-」(如果是)空的。
在 Laravel 中處理 NULL 或空值排序是處理可能並不總是完整的資料時的常見任務。透過將 orderByRaw() 方法與 SQL 表達式(如 attend_at IS NULL、attend_at DESC)結合使用,您可以輕鬆確保具有 NULL 值的行出現在底部,同時仍以有意義的方式對其餘資料進行排序。
此方法在處理考勤的場景中特別有用,如本範例所示,但它也可以應用於某些資料欄位可能遺失的許多其他情況。透過這種方法,您可以在應用程式中為使用者提供更清晰、更直觀的記錄顯示。
編碼愉快!
以上是在 Laravel 中對底部為空值和非空值的行進行降序排序的詳細內容。更多資訊請關注PHP中文網其他相關文章!