我在数据库中为出勤签到创建记录时遇到了一个大问题。我正在使用当前的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
]);
}
}
我不知道在处理此记录中的重复记录时是否有任何错误。您能否给我一些有关如何更改此代码以处理重复记录的建议,应该通过移动用户界面返回“已签入”
答案 0 :(得分:0)
在用户功能checkIn
中,请勿在{{1}}查询中使用->where('created_at' , date(now()))
,因为这始终是新的时间,无论您单击的速度有多快,都不会超过毫秒。而且,您也不会检查同一用户是否已在同一位置签到。
例如,在您的现有查询中,如果用户使用以下查询签入,请在最近5分钟内检查同一用户在同一位置:
exists