You need to enable JavaScript to run this app. Laravel 用户登录后login_count字段仅首次递增后续无变化问题
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 用户登录后login_count字段仅首次递增后续无变化问题

问题根因

你代码里的核心错误是混用了直接操作数据库的递增方法和update()批量更新逻辑:

  • Eloquent的increment()方法本身就会直接触发数据库写入操作,不需要再放到update()的参数数组中
  • increment('login_count')执行成功后返回值是1(表示本次操作影响了1行数据),你把这个返回值赋值给update()里的login_count字段,等于每次登录都会先把字段+1,再立刻被覆盖为固定值1,所以永远停留在1。
  • last_login能正常更新是因为你给它传的是正确的时间值,没有被其他操作覆盖。

解决方案

有两种正确写法可选,任选其一即可:

写法1:分开执行更新操作(推荐,可读性更高)

把登录次数递增和最后登录时间更新分开写,不要混在同一个update数组里:

public function login(LoginRequest $request): JsonResponse
{
    $data = $request->validated();

    if (!Auth::attempt($data)) {
        return response()->json(['message' => 'Invalid Credentials'], 401);
    }

    $user = Auth::user();
    // 单独执行递增,自动写入数据库
    $user->increment('login_count');
    // 更新最后登录时间
    $user->update([
        'last_login' => now()
    ]);

    $token = $user->createToken('api')->plainTextToken;

    return response()->json([
        'access_token' => $token,
    ]);
}

写法2:合并到同一个update操作

如果要把两个字段更新合并到同一次数据库请求里,就不要用increment(),推荐直接在数据库层面做自增计算,还能避免并发场景下的计数误差:

$user = Auth::user();
$user->update([
    'last_login' => now(),
    'login_count' => \DB::raw('login_count + 1')
]);

你之前尝试auth()->user()->login_count++没生效,是因为只修改了模型对象的属性值,没有调用save()方法把修改同步到数据库,补充写入操作就能生效:

$user = auth()->user();
$user->login_count++;
$user->last_login = now();
$user->save(); // 必须调用save才能把修改写入数据库

内容的提问来源于stack exchange,提问作者BigJobbies

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 06:48:09