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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:17:50