0
votes

I am using Laravel-5.8 and Maatwebsite-3.1 to export to excel.

<?php

namespace App\Exports;

use App\User;
use Auth;

class StudentExport implements FromCollection, ShouldAutoSize, WithHeadings, WithMappings, WithCustomStartCell
{

    private $headings = [
        'Student ID', 
        'Name',
        'Class',
        'Status',
        'Teacher'
    ];

    public function collection()
    {
        $current_terms = DB::table('appraisal_identity')->select('term_name')->where('company_id', $userCompany)->where('is_current', 1)->first()->term_name;
        $publishedgoals = AppraisalGoal::select('employee_code')->where('is_published', 1)->where('company_id', $userCompany)->groupBy('employee_code')->get();  


        $published_goals = DB::table('hr_students AS e')
                    ->join('hr_employees AS em','em.id','=','e.teacher_id')
                     ->select(
                        'e.student_id',
                        DB::raw('CONCAT(e.first_name, " ", e.last_name) AS full_name'),
                        'e.student_class,
                        DB::raw('(CASE WHEN e.is_status = 3 THEN "Excellent" WHEN e.is_status = 2 THEN "Good" WHEN e.is_status = 1 THEN "Average" ELSE "Pass" END) AS student_status') 
                        DB::raw('CONCAT(em.first_name, " ", em.last_name) AS teacher_name')
                        
                 )
                    ->whereIn('e.student_id', $publishedgoals)
                ->distinct()
                ->get();

            $published_goals = $published_goals->unique('student_id');
       
           return collect($published_goals, $current_terms);
    } 

public function map($published_goals, $current_terms): array
{
    return [
       $published_goals->student_id,
       $published_goals->full_name,
       $published_goals->student_class,
       $published_goals->student_status,
       $published_goals->teacher_name,
       $current_terms->term_name,
   ];
 }  

public function startCell(): string
{
    return 'A4';
}    


public function headings() : array
{

    return $this->headings;
}    

public function registerEvents() : array
{
    return [
        AfterSheet::class    => function(AfterSheet $event) {

            $event->sheet->setCellValue('A2', 'Current Term:'); 
            $event->sheet->getDelegate()->setCellValue('B2', $current_terms);


            $cellRange = 'A4:E4'; // All headers
            $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(14);
            $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->getColor()
                   ->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
            $event->sheet->getDelegate()->getStyle($cellRange)->getFill()
                   ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
                   ->getStartColor()->setARGB('FF17a2b8');
            $event->sheet->setAutoFilter($cellRange);
        },
    ];
  }   

}

This is my expected output:

output

I have written the code above to get this result:

I want to make B2 to have the output of this variable: $current_terms

I got this error:

ERROR: Declaration of App\Exports\HrEmployeeGoalExport::map($published_goals, $current_terms): array must be compatible with Maatwebsite\Excel\Concerns\WithMapping::map($row)

How do I resolve this?

Thank you

1

1 Answers

0
votes

You are implementing a number of the contracts from the Maatwebsite\Excel package, one of those contracts specifies that you must implement a map method that takes a $row as the argument; Maatwebsite\Excel\Concerns\WithMapping::map($row).

In your class you have HrEmployeeGoalExport::map($published_goals, $current_terms): array

To get this to work, you must change your map function to be HrEmployeeGoalExport::map($row) and then use $row to do any mapping.'

As such, you need to change the arguments you are receiving and remove the return type that you have specified.