Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

ssquare's avatar

Call to a member function all() on array on Maatwebsite Excel export

My code:

    public function export(Request $request)
    {
        $classroom = Classroom::with('grade')->where('id',$request->input('classroom'))->firstOrFail();
        $attendances = Attendance::where('classroom_id', $classroom->id)
            ->whereYear('attendance_date', 2021)
//            ->whereMonth('attendance_date', Carbon::now()->month)
            ->get()
            ->groupBy(function($item) {
                return Carbon::parse($item->attendance_date)->format('m');
            });
        $data = $attendances;

        $filename = Str::title($classroom->grade->grade_name).' - ('.$classroom->class_year->format('Y').' ).xlsx';
        return (new AttendanceExport($data))->download($filename, \Maatwebsite\Excel\Excel::XLSX);
    }

Error throwing on this line:

return (new AttendanceExport($data))->download($filename, \Maatwebsite\Excel\Excel::XLSX);

MY AttendanceExport looks like:

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;


class AttendanceExport implements WithMultipleSheets
{
    use Exportable;
    protected $data;

    public function __construct($data)
    {
        $this->data = $data;
    }


    public function sheets(): array
    {
        $sheets = [];

        for ($month = 1; $month <= 12; $month++) {
            $padded_month = sprintf("%02d", $month);
            $currentMonthData = $this->data[$padded_month];
            $sheets[] = new AttendanceExportPerMonthSheet($currentMonthData);
        }

        return $sheets;
    }
}

and AttendanceExportPerMonthSheet is:

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromArray;


class AttendanceExportPerMonthSheet implements FromCollection, WithHeadings, WithStrictNullComparison
{
    use Exportable;
    protected $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function headings(): array
    {
        $heading['name'] = 'Student Name';
        $totalDateArr = $this->data->unique('attendance_date')->pluck('attendance_date')->sort();
        foreach($totalDateArr as $v){
            $current_day = \Carbon\Carbon::parse($v)->format('d');
            $heading[$current_day] = $current_day;
        }
        return $heading;
    }

    public function collection()
    {
        $attendances = $this->data->groupBy('student_id');
        $result = [];
        foreach($attendances as $k => $studentAttendanceArr){
            $row = [];
            $row['name'] = 'Name';
            foreach($studentAttendanceArr as $sk => $v){
                $row[\Carbon\Carbon::parse($v->attendance_date)->format('d')] = $v->present_status ? 'yes': 'no';
            }
            $result[] = $row;
        }
        return $result;
    }
}

Please, let me know if I should provide dd() of any value.

0 likes
1 reply
tykus's avatar
tykus
Best Answer
Level 104

Your AttendanceExportPerMonthSheet class implements FromCollection but you are returning an array from the collection method - you could simply return collect($result) or re-write the collection method using a Collection Pipeline instead:

public function collection()
{
    return $this->data->groupBy('student_id')->map(function ($attendances) {
        return $attendances->mapWithKeys(function ($attendance) {
            return [
                Carbon::parse($attendance->attendance_date)->format('d') => $attendance->present_status ? 'yes': 'no'
            ];
        })->merge(['name' => 'Name']);
    });
}

Please or to participate in this conversation.