基于Laravel实现推荐积分系统:推荐注册赠50积分功能咨询
在Laravel中实现推荐积分功能
嘿,这个需求其实挺常见的,我来一步步给你拆解怎么实现:
1. 准备数据库与模型
首先得确保你的用户表有两个关键字段:
referred_by: 用来记录新用户的推荐人ID(可选字段)balance: 存储用户的积分值(默认0)
如果还没加这两个字段,咱们可以生成一个迁移文件:
php artisan make:migration add_referred_by_and_balance_to_users_table
然后在迁移文件里写:
public function up() { Schema::table('users', function (Blueprint $table) { $table->unsignedBigInteger('referred_by')->nullable(); $table->integer('balance')->default(0); // 可选:添加外键约束,关联到users表的id $table->foreign('referred_by')->references('id')->on('users')->onDelete('set null'); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropForeign(['referred_by']); $table->dropColumn(['referred_by', 'balance']); }); }
运行迁移:
php artisan migrate
接下来在User模型里,把这两个字段加入$fillable数组(或者用$guarded = []):
class User extends Model { use HasApiTokens, HasFactory, Notifiable; protected $fillable = [ 'name', 'email', 'password', 'referred_by', // 新增 'balance', // 新增 ]; // 可选:封装一个增加积分的方法,让逻辑更清晰 public function addPoints(int $amount) { // 使用increment是原子操作,避免并发更新的问题 $this->increment('balance', $amount); } }
2. 处理注册表单验证
接下来要给注册表单的referral_id字段加验证规则:如果用户填写了推荐ID,必须是系统中存在的用户ID。
如果你用的是Laravel默认的注册请求类RegisterRequest,修改它的rules方法:
public function rules() { return [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'confirmed', Rules\Password::defaults()], 'referral_id' => ['nullable', 'exists:users,id'], // 新增这条规则 ]; }
3. 修改注册逻辑,完成积分奖励
找到默认的注册控制器RegisteredUserController(通常在app/Http/Controllers/Auth目录下),修改它的store方法,加入推荐积分的逻辑:
use Illuminate\Support\Facades\DB; public function store(Request $request) { $validated = $request->validated(); // 用数据库事务包裹,确保用户注册和积分增加要么都成功,要么都失败 DB::transaction(function () use ($validated) { $user = User::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'password' => Hash::make($validated['password']), 'referred_by' => $validated['referral_id'] ?? null, // 记录推荐人ID ]); // 如果存在有效的推荐ID,给推荐人加50积分 if (isset($validated['referral_id'])) { $referrer = User::findOrFail($validated['referral_id']); $referrer->addPoints(50); // 调用咱们之前封装的方法 // 或者直接写:$referrer->increment('balance', 50); } Auth::login($user); event(new Registered($user)); }); return redirect(RouteServiceProvider::HOME); }
4. 额外注意事项
- 并发安全:用
increment方法而不是手动计算balance + 50再保存,因为increment是数据库层面的原子操作,能避免多个请求同时更新积分时的冲突。 - 事务处理:把用户创建和积分增加放在同一个事务里,防止出现用户注册成功但推荐人积分没加上的情况。
- 测试验证:可以先注册一个测试用户(比如ID为1),然后用这个ID作为
referral_id注册新用户,查看数据库里用户1的balance是否变成50。
这样一套流程下来,就完成了你需要的推荐积分功能啦!
内容的提问来源于stack exchange,提问作者Cadeth
相关产品推荐
相关产品推荐

