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
相关产品推荐
相关产品推荐

