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
相关产品推荐
相关产品推荐

