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

Laravel集合Blade循环报错:Property [hrid]不存在于集合实例

解决Laravel Collection分组后Blade循环报错"Property [hrid] does not exist"的问题

首先咱们得搞清楚问题根源:你用groupBy('hrid','clockedday')之后,返回的集合是两层嵌套的键值对结构,而非你预期的包含hrid属性的对象集合。具体来说,它的结构大概是这样的:

Collection {
  [hrid数值] => Collection {
    [clockedday日期] => Collection {
      0 => { "name": "...", "hrid": "...", ... }
    }
  }
}

当你在Blade里直接遍历顶层集合时,每个循环项是「按日期分组的子集合」,不是单个考勤记录对象,所以你尝试访问$item->hrid时,自然会报错说这个属性不存在于集合实例上。


解决方案:匹配嵌套结构遍历

根据你的分组逻辑,需要用三层嵌套的foreach来对应这个结构,示例Blade代码如下:

@foreach ($Report as $hrid => $dailyAttendances)
    <div class="employee-card">
        <h3>员工ID: {{ $hrid }}</h3>
        @foreach ($dailyAttendances as $clockedDay => $attendanceRecords)
            <div class="daily-record">
                <h4>考勤日期: {{ $clockedDay }}</h4>
                <ul>
                    @foreach ($attendanceRecords as $record)
                        <li>
                            姓名: {{ $record->name }}<br>
                            上班时间: {{ $record->timein }}<br>
                            下班时间: {{ $record->Timeout }}<br>
                            总工时: {{ $record->totalworkedhours }}
                        </li>
                    @endforeach
                </ul>
            </div>
        @endforeach
    </div>
@endforeach

可选调整:修改分组逻辑(如果不需要两层嵌套)

如果你不需要同时按hrid和clockedday两层分组,也可以在控制器里调整groupBy的方式,比如只按员工ID分组,让每个员工下直接是所有日期的考勤记录:

$Report = Db::table('Attendance_Processed as procc')
    ->leftjoin('Emp_Details', 'Emp_Details.HRApp_Emp_Id', '=', 'procc.HRApp_Emp_Id')
    ->where('procc.Org_ID',$orgid)
    ->where('Emp_Details.Supervisor_Emp_ID',$hrid)
    ->whereYear('Clock_Day',$yearofdata)
    ->whereMonth('Clock_Day',$monthofdata)
    ->select('Emp_Details.Emp_First_Name as name','procc.HRApp_Emp_Id as hrid', 'procc.Clock_Day as clockedday', 'procc.Time_in as timein', 'procc.Time_out as Timeout', 'procc.Total_Work_Hrs as totalworkedhours')
    ->get()
    ->groupBy('hrid'); // 仅按员工ID分组

对应的Blade循环可以简化为两层:

@foreach ($Report as $hrid => $attendanceRecords)
    <div class="employee-card">
        <h3>员工ID: {{ $hrid }}</h3>
        <table>
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>考勤日期</th>
                    <th>上班时间</th>
                    <th>下班时间</th>
                    <th>总工时</th>
                </tr>
            </thead>
            <tbody>
                @foreach ($attendanceRecords as $record)
                    <tr>
                        <td>{{ $record->name }}</td>
                        <td>{{ $record->clockedday }}</td>
                        <td>{{ $record->timein }}</td>
                        <td>{{ $record->Timeout }}</td>
                        <td>{{ $record->totalworkedhours }}</td>
                    </tr>
                @endforeach
            </tbody>
        </table>
    </div>
@endforeach

小提示

遇到集合结构问题时,随时用dd($Report)打印出集合的具体结构,这样你能清晰看到每一层的键和值,更容易调整循环逻辑。

内容的提问来源于stack exchange,提问作者Madhu Nair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:36:17