Laravel Blade取最后7条数据报错:Call to a member function take() on array
问题:Blade模板调用take()方法报错「Call to a member function take() on array」
在Laravel开发中,尝试在Blade模板里展示集合的最后7条结果时,触发错误:Call to a member function take() on array。注:Blade中的@foreach ($audits as $item)嵌套在@foreach ($data as $area => $audits)循环内。
Blade代码
@foreach ($audits->take(-7) as $item) @if ($item->esito === 'POSITIVO') <div style="display: flex; flex-direction:column;"> <span class="audit-daily-text39"> <strong style="font-size: 13px;">{{ \Carbon\Carbon::parse($item->data_audit)->format('d/m') }}</strong> </span> <div class="audit-daily-frame4364"> <div class="audit-daily-day-ko"> <div class="audit-daily-cell"> <div class="mb-2"> <i class="align-middle me-2 fas fa-fw fa-check" style="color: white; position: relative; top: 6px; left: 4px;"></i> </div> </div> </div> </div> </div> @elseif ($item->esito === 'NEGATIVO') <div style="display: flex; flex-direction:column;"> <span class="audit-daily-text39"> <strong style="font-size: 13px;">{{ \Carbon\Carbon::parse($item->data_audit)->format('d/m') }}</strong> </span> <div class="audit-daily-frame4364"> <div class="audit-daily-day-ko"> <div class="audit-daily-cell" style="background-color: red"> <div class="mb-2"> <i class="align-middle me-2 fas fa-fw fa-close" style="color: white; position: relative; top: 6px; left: 4px;"></i> </div> </div> </div> </div> </div> @endif @endforeach
Controller代码
if (DB::table('esiti_audit')->where('employee', $name)->doesntExist()) { $data = "0"; } elseif (DB::table('esiti_audit')->where('employee', $name)->exists()) { $audits = DB::table('esiti_audit') ->where('employee', $name) ->where('frequency_audit', "DAY") ->select(['master_zone', 'subarea', 'microarea', 'data_audit', 'esito']) ->orderBy('master_zone', 'asc') ->orderBy('subarea', 'asc') ->orderBy('microarea', 'asc') ->orderBy('data_audit', 'asc') ->get() ->toArray(); $data = []; foreach ($audits as $audit) { $areaKey = "{$audit->master_zone} {$audit->subarea} {$audit->microarea}"; $data[$areaKey][] = [ 'esito' => $audit->esito, 'data_audit' => $audit->data_audit ]; }; };
解决方案
错误原因
Controller中把查询结果通过->toArray()转成了普通PHP数组,后续处理$data时又生成了多维数组。Blade循环里的$audits是普通数组,而take()是Laravel集合的专属方法,数组无法调用该方法,因此报错。
解决办法1:数组转集合后调用take()
直接在Blade模板里把数组转为Laravel集合,再使用take(-7)获取最后7条数据:
@foreach (collect($audits)->take(-7) as $item)
解决办法2:用PHP原生函数截取数组
使用PHP原生的array_slice()函数直接截取数组最后7个元素,无需依赖集合:
@foreach (array_slice($audits, -7) as $item)
解决办法3:Controller中保留集合类型
修改Controller代码,去掉->toArray(),让查询结果保持集合类型,后续处理时也用集合操作:
// 去掉->toArray(),保留集合类型 $audits = DB::table('esiti_audit') ->where('employee', $name) ->where('frequency_audit', "DAY") ->select(['master_zone', 'subarea', 'microarea', 'data_audit', 'esito']) ->orderBy('master_zone', 'asc') ->orderBy('subarea', 'asc') ->orderBy('microarea', 'asc') ->orderBy('data_audit', 'asc') ->get(); // 处理$data时存入集合 foreach ($audits as $audit) { $areaKey = "{$audit->master_zone} {$audit->subarea} {$audit->microarea}"; $data[$areaKey][] = collect([ 'esito' => $audit->esito, 'data_audit' => $audit->data_audit ]); };
这种方式能保留集合的所有方法,适合后续需要对数据做更多集合操作的场景。
内容的提问来源于stack exchange,提问作者Morex
相关产品推荐
相关产品推荐

