如何用Laravel Eloquent从三关联表获取每个用户的最后考勤日期
Laravel Eloquent 获取用户最后考勤日期解决方案
1. 定义模型关联
先完成三个模型的关联关系配置:
User 模型
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class User extends Model { protected $table = 'users'; // 一个用户对应多条用户考勤记录 public function userAttendances(): HasMany { return $this->hasMany(UserAttendance::class, 'user_id'); } }
UserAttendance 模型
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class UserAttendance extends Model { protected $table = 'user_attandance'; // 与数据表名保持一致 // 每条用户考勤记录对应一条考勤日期记录 public function attendance(): BelongsTo { return $this->belongsTo(Attendance::class, 'attandance_id'); } // 每条用户考勤记录属于一个用户 public function user(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } }
Attendance 模型
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class Attendance extends Model { protected $table = 'attendance'; // 一条考勤日期对应多条用户考勤记录 public function userAttendances(): HasMany { return $this->hasMany(UserAttendance::class, 'attandance_id'); } }
2. 获取单个用户的最后考勤日期
针对单个用户,可通过两种方式查询:
// 获取指定用户 $user = User::find($userId); // 方式1:关联Join高效查询 $lastAttendanceDate = $user->userAttendances() ->join('attendance', 'user_attandance.attandance_id', '=', 'attendance.id') ->latest('attendance.date') ->value('attendance.date'); // 方式2:利用关联嵌套(适合需要额外考勤信息的场景) $lastAttendance = $user->userAttendances() ->with('attendance') ->latest('attendance.date') ->first(); $lastAttendanceDate = $lastAttendance?->attendance?->date;
3. 批量获取所有用户及其最后考勤日期
用子查询避免N+1问题,高效批量获取:
$usersWithLastAttendance = User::select('users.*') ->selectSub(function ($query) { $query->select('attendance.date') ->from('user_attandance') ->join('attendance', 'user_attandance.attandance_id', '=', 'attendance.id') ->whereColumn('user_attandance.user_id', 'users.id') ->latest('attendance.date') ->limit(1); }, 'last_attendance_date') ->get(); // 遍历输出示例 foreach ($usersWithLastAttendance as $user) { echo "用户:{$user->name},最后考勤日期:{$user->last_attendance_date}"; }
4. 简化调用:添加模型访问器
在User模型中添加访问器,直接通过属性获取:
// 写入User模型 public function getLastAttendanceDateAttribute() { return $this->userAttendances() ->join('attendance', 'user_attandance.attandance_id', '=', 'attendance.id') ->latest('attendance.date') ->value('attendance.date'); } // 使用示例 $user = User::find($userId); echo $user->last_attendance_date;
内容的提问来源于stack exchange,提问作者Kaushal Patel
相关产品推荐
相关产品推荐

