Home > Net >  Laravel collection Call to a member function exports() on array
Laravel collection Call to a member function exports() on array

Time:10-27

I am trying to pass some values as array on jobExport() collection and am getting an error Call to a member function jobsExport() on array. I understand that the collection need to populatet with modal collection value, but am trying to export multiple record(only record i select) from table , and to make this happend i thing i need to pass value as array from control to modal method, i have searched a loot to find a solution for this but i dont find anythin yet. Here is what i have done

Route

Route::any('export/jobs/{jobs}', [JobController::class, 'export']);

Pass data from vue to laravel

watch: {
            selected: function(){
                this.url = '/export/jobs/'   this.selected;
            }
        },
// After sending  request on backend route will look like this
http://127.0.0.1:8000/export/jobs/1,2,4

Laravel controller

public function export($jobs)
    {   
        return Excel::download(new JobsExport($jobs), 'jobs.xlsx');
    }

Model Method

public function jobsExport()
    {
        return Job::with('templates', 'teams')
            ->whereHas('templates', function ($q) {
                $q->where('id', $this->id);
            })
            ->get();
    }

JobExport

class JobsExport implements WithStyles, FromCollection, WithMapping, WithHeadings
{
    use Exportable;
    
    private $jobs;

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

    public function collection()
    {
        return $this->jobs->jobsExport();
    }

    public function map($jobsExport): array
    {
        // dd($jobsExport->templates->first()->template_name);
        return [
            $jobsExport->id,
            $jobsExport->templates->implode('template_name', ', '),
            $jobsExport->job_completed,
        ];
    }

    /**
    * @return \Illuminate\Support\Collection
    */ 
    public function headings():array
    {
        return[
            'Id',
            'Template',
            'Completed',
        ];
    } 
}

CodePudding user response:

Is the $jobs an id? If so, make it $jobId

public function export($jobId)
{  
    // assuming you have Job model which holds the jobs table
    $jobs = Job::where('id', $jobId)->get();

    return Excel::download(new JobsExport($jobs), 'jobs.xlsx');
}

and in your export class

class JobsExport implements WithStyles, FromCollection, WithMapping, WithHeadings
{
    use Exportable;
    
    private $jobs;

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

    public function collection()
    {
        // change this 
        //return $this->jobs->jobsExport();

        // to
        return $this->jobs;
    }

    public function map($jobsExport): array
    {
        // dd($jobsExport->templates->first()->template_name);
        return [
            $jobsExport->id,
            $jobsExport->templates->implode('template_name', ', '),
            $jobsExport->job_completed,
        ];
    }

    /**
    * @return \Illuminate\Support\Collection
    */ 
    public function headings():array
    {
        return[
            'Id',
            'Template',
            'Completed',
        ];
    } 
}
  • Related