Laravel:保留自增ID属性时插入自定义随机ID的问题
没问题,我来帮你搞定这个Laravel的ID问题!你遇到的核心问题是Laravel Eloquent默认会忽略手动传入的id值,因为它默认认为主键是自增的。下面是具体的解决步骤,还会顺便修复你生成ID代码里的小bug:
1. 让Eloquent尊重你传入的自定义ID
你不需要永久移除数据表的自增属性,只需要在创建用户前临时关闭模型的自动递增特性,这样框架就会使用你传入的ID值,而不是自动生成。
方法一:临时修改模型设置
直接在创建代码前添加一行临时关闭自动递增的代码:
// 临时告诉User模型不要自动生成ID User::query()->getModel()->setIncrementing(false); $new_user_id = CreateRandomId::get_id('users'); $user = User::create([ 'id' => $new_user_id, 'social_id'=>$request->id, 'client'=> $request->client, 'username'=>$request->username, 'password'=>$password, 'email'=>$request->email, 'pics'=>$request->pics, 'role'=>'user' ]); // 可选:之后如果还要用默认的自增ID,可以恢复设置 User::query()->getModel()->setIncrementing(true);
方法二:封装成模型的静态方法(更整洁)
如果之后还要频繁用这个功能,可以在User模型里写一个静态方法,把逻辑封装起来:
// app/Models/User.php public static function createWithCustomId(array $attributes) { // 临时关闭自动递增 static::getModel()->setIncrementing(false); // 创建用户 $user = static::create($attributes); // 恢复默认设置 static::getModel()->setIncrementing(true); return $user; }
然后调用的时候就更简洁了:
$new_user_id = CreateRandomId::get_id('users'); $user = User::createWithCustomId([ 'id' => $new_user_id, // 其他字段... ]);
2. 修复你的随机ID生成类的bug
你的CreateRandomId类里有个隐藏的问题:当检测到ID重复时,递归调用了get_id但没有返回结果,这样最终还是会返回原来的重复ID!修改一下递归的部分:
class CreateRandomId { public static function get_id($my_table) { $id = mt_rand(1000000, 9999999999); if(self::check_id($id,$my_table)){ // 这里一定要return递归生成的新ID return self::get_id($my_table); } return $id; } public static function check_id($id,$my_table) { // 用exists()比count()更高效,数据库只需要检查是否存在记录 return DB::table($my_table)->where('id',$id)->exists(); } }
3. 关于数据库自增属性的说明
不用担心保留数据表的自增属性会有问题——MySQL允许在自增字段中手动插入未被占用的ID值,插入后,后续的自动生成ID会从当前最大的ID值继续递增(比如你插入了ID 1000000,下一个自动生成的ID会是1000001,前提是之前的最大ID小于这个数)。
内容的提问来源于stack exchange,提问作者Sermed mayi
相关产品推荐
相关产品推荐

