按创建按钮2次和存储数据2次时出现问题

时间:2018-11-18 09:03:02

标签: php laravel

我在数据库中为出勤签到创建记录时遇到了一个大问题。我正在使用当前的DATE-TIME-LOCATION将考勤信息存储到数据库中。当用户在移动应用中按下check_in时,它将考勤记录存储到数据库中并返回成功消息。但是,当用户第二次按下check_in时,它应该返回消息“已签入”,但仍会创建记录。

这是我在User.php中的代码

public function checkIn()
    {
        $exists = Attendance::where('attendance_date' , Carbon::now()->format('Y-m-d'))
            ->whereNotNull('scan_in_time')
            ->where('created_at' , date(now()))
            ->exists();
        if($exists){
            return false;
        }

        return $this->attendance()->create([
            'attendance_date' => Carbon::now()->format('Y-m-d'),
            'scan_in_time' => Carbon::now()->format('H:i:s'),
            'attendance_status' => DB::RAW("CASE
                WHEN scan_in_time >= '08:30:00' AND scan_in_time < '09:00:00' THEN '2'
                WHEN scan_in_time > '09:00:00' AND scan_in_time < '17:00:00' THEN '3' ELSE '1' END"),
            'scan_in_location' => request()->scan_in_location,
            'scan_in_remarks' => request()->scan_in_remarks
        ]);
    }

这是在AttendanceController中:

public function check_in(Request $request)
    {
        $attendance = $request->user()->checkIn();

        if($attendance){
            return response()->json([
                'success' => false,
                'message' => 'Fail',
            ]);
        }else{
            return response()->json([
                'success' => true,
                'message' => 'Success',
//                'data' => $attendance
            ]);
        }
    }

我不知道在处理此记录中的重复记录时是否有任何错误。您能否给我一些有关如何更改此代码以处理重复记录的建议,应该通过移动用户界面返回“已签入”

1 个答案:

答案 0 :(得分:0)

在用户功能checkIn中,请勿在{{1​​}}查询中使用->where('created_at' , date(now())),因为这始终是新的时间,无论您单击的速度有多快,都不会超过毫秒。而且,您也不会检查同一用户是否已在同一位置签到。

例如,在您的现有查询中,如果用户使用以下查询签入,请在最近5分钟内检查同一用户在同一位置:

exists