You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:20:28