Laravel 幾種少用的排序方式程式碼

hxd發表於2020-05-28

原文連結 何曉東 部落格

程式碼未考慮效能問題,在大表排序情況下,建議考慮多種實現方式,對比效能

按中文拼音排序

重點是轉換成 gbk 格式就可以排序,原因即是 GBK 特性

orderByRaw('CONVERT (name USING gbk)');
按距離當前日期的差距排序

DATEDIFF 函式可以計算當前日期和資料日期的差距,但是會出現負數的情況,所以需要用 CAST(xx AS UNSIGNED) 將負數轉成無符號整數,然後升序排列。

orderByRaw("CAST(DATEDIFF(started_date, CURDATE()) AS UNSIGNED) asc");
按指定的幾個值優先排序

直接 order by xx in (1,2) 這樣的形式就行,其他未指定的,會自然排序,適用場景比較小,例如推薦的商品,優先推薦現在有售的,預售的排在後面。

->orderByRaw(DB::raw("status in (2,3) desc"));
# 全部順序的話可以適用 field(status, 1, 2, 3);  這樣的全部順序排序
按搜尋相關度匹配

例如這種,name 按完全相同的優先,然後前置相同的次之,前後匹配相同的再次之,然後是後置匹配的倒序,直接使用case when模式求值

->orderByRaw(DB::raw("CASE WHEN name='" . $name . "' THEN 1 WHEN name like '" . $name . "%' THEN 2
            WHEN name like '%" . $name . "%' THEN 3 WHEN name like '%" . $name . "' THEN 4 ELSE 5 END"))

© 原創文章

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Keep Young, Keep Simple.

相關文章