如何将Laravel中的雪花ID转换成字符串表示形式?
- 内容介绍
- 相关推荐
本文共计1109个文字,预计阅读时间需要5分钟。
在设计API时,考虑到安全性等因素,有时需要放弃使用自增ID。ID应非连续且不可预测。通常可以使用Hash ID、UUID、雪花算法ID等方式实现。在最近的一个项目中,我尝试使用了雪花算法ID。
在设计 API 时,出于安全性等因素考虑,有时需要放弃使用自增 ID,使 ID 非连续且不可猜测。通常可以使用 Hash id,UUID,雪花 ID 等来实现。
在最近的一个项目中,我尝试使用雪花 ID。一通折腾下来发现,逼格挺高,实现也挺简单。然而当我继续撸起袖子与前端部分对接时,却出现了 JS 精度丢失问题,因为存储的 ID 是一个 unsigned bigint 型的值。(至于为什么会有精度丢失现象,这里就不具体解释了,不清楚的可以自行搜索),本文主要介绍解决办法。
想要解决这问题,基本原理也很简单,就是把 ID 转成字符串再返回给前端。
错误尝试
一开始我想到的是使用 Laravel Eloquent 模型的模型访问器。只要给需要转换的模型加一个 getIdAttribute,将 ID 转成字符串不就行了嘛?
如:AppModelsUser 模型里这样写:
/** * @return string */ public function getIdAttribute() { return strval($this->attributes['id']); }
但事实并非如此,属性访问器确实能让 API 返回给前端的 ID 变为字符串。
本文共计1109个文字,预计阅读时间需要5分钟。
在设计API时,考虑到安全性等因素,有时需要放弃使用自增ID。ID应非连续且不可预测。通常可以使用Hash ID、UUID、雪花算法ID等方式实现。在最近的一个项目中,我尝试使用了雪花算法ID。
在设计 API 时,出于安全性等因素考虑,有时需要放弃使用自增 ID,使 ID 非连续且不可猜测。通常可以使用 Hash id,UUID,雪花 ID 等来实现。
在最近的一个项目中,我尝试使用雪花 ID。一通折腾下来发现,逼格挺高,实现也挺简单。然而当我继续撸起袖子与前端部分对接时,却出现了 JS 精度丢失问题,因为存储的 ID 是一个 unsigned bigint 型的值。(至于为什么会有精度丢失现象,这里就不具体解释了,不清楚的可以自行搜索),本文主要介绍解决办法。
想要解决这问题,基本原理也很简单,就是把 ID 转成字符串再返回给前端。
错误尝试
一开始我想到的是使用 Laravel Eloquent 模型的模型访问器。只要给需要转换的模型加一个 getIdAttribute,将 ID 转成字符串不就行了嘛?
如:AppModelsUser 模型里这样写:
/** * @return string */ public function getIdAttribute() { return strval($this->attributes['id']); }
但事实并非如此,属性访问器确实能让 API 返回给前端的 ID 变为字符串。

