Laravel用户创建时UUID类型rank_id赋值优化方案咨询
可行的优化方案
方案1:给ranks表加稳定的唯一标识字段(不改主键类型)
现有实现的核心问题是用title作为查询条件不够稳定,万一后续调整等级名称就会导致代码报错。可以给ranks表新增唯一的slug字段,存储不会变更的英文标识,比如user、vip、admin这类固定值。
- 新增迁移给ranks表加slug字段:
Schema::table('ranks', function (Blueprint $table) { $table->string('slug')->unique()->after('title'); });
- 给Rank模型封装快捷查询方法,同时加缓存避免重复查库:
class Rank extends Model { public static function getBySlug(string $slug) { return cache()->rememberForever("rank_{$slug}_id", function () use ($slug) { return self::where('slug', $slug)->value('id'); }); } }
- 调整用户创建逻辑,代码可读性大幅提升:
User::create([ 'rank_id' => Rank::getBySlug('user'), 'username' => $request->input('username'), 'email' => strtolower($request->input('email')), 'password' => Hash::make($request->input('password')), ]);
后续如果修改ranks表数据,只需要清理对应的缓存即可。
方案2:ranks表改用自增主键(混合ID类型完全合理)
没有任何规范要求整个系统必须统一主键类型,主键选型完全可以根据表的业务属性判断:
- 用户表这类数据量大、可能涉及分库分表、需要避免ID泄露业务规模的场景,用UUID非常合适
- ranks这类属于数据量极小、变更频率极低的配置枚举表,用自增ID反而开发效率更高、性能更好,完全不存在不合理的问题
如果切换自增ID,你甚至可以直接在Rank模型里定义常量,连查询操作都可以省掉:
class Rank extends Model { public const RANK_USER = 1; public const RANK_VIP = 2; public const RANK_ADMIN = 3; }
创建用户时直接赋值常量即可:
User::create([ 'rank_id' => Rank::RANK_USER, // 其他字段 ]);
其他可选优化
如果不想修改表结构,也可以把现有等级的title和UUID的映射写到配置文件里,项目初始化/等级变动时同步更新配置,直接读取配置值即可,也不需要每次查库。
内容的提问来源于stack exchange,提问作者Kylian
相关产品推荐
相关产品推荐

