You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:52:54