概述:
最近公司的后台管理新需求是做一个某列表的拖拉排序功能,本来认为这个功能实现也挺简单的,但实际做起来,其实也会遇到一些问题。因此,我决定写篇文章来给大家分享一下。
准备:
1、排序的数据存储实现分析:
既然是排序,那么就是要求每行数据要有明确的前后区分,也就是要求排序的字段有唯一性,唯一性当然会想起表主键id,但是我们不可能对主键进行修改的,这样会导致一些根据主键关联的可能会出现问题。
那我们只能创建一个新的字段decimal(11,4)类型的sort,并且建立唯一索引,来区分这个排序了。这里为什么是decimal(11,4)类型,而不是int类型呢,这个我会在文章后面解释。
2、排序的算法选择:

假设我这里的排序是[24=>1,19=>2,18=>3,17=>4,16=>5,15=>6]
拖拉排序有可能是拖到第一条,也有可能拖到最后一条,还有可能拖到中间一条。
但是无论数据从哪个位置拖到新位置,无非是在新位置的前后两条排序中间创建一个新的排序,而它旧的排序就删除。
比如说我这里的id15想要拖到id19与id18之间:

那么按照唯一性,id15就变成了排序3,此时的排序为[24=>1、19=>2、15=>3、18=>3、17=>4、16=>5],这里有两个3,因此第一个3后面的就需要重新排序变成[24=>1、19=>

本文分享了在 Laravel 中实现拖拉排序功能的思路和方法,包括排序数据的存储实现,算法选择,以及接口实现的细节。通过使用 decimal(11,4) 类型的 sort 字段保持唯一性,并讨论了浮点数排序的优化空间和重置策略,以应对大量数据的排序更新问题。"
112174943,10325282,AE蒙版与遮罩详解:兄弟间的失散与重逢,"['视频编辑', '特效处理', 'Adobe After Effects', '图形处理']
最低0.47元/天 解锁文章
950





