Jimmy
Jimmy

Reputation: 252

Laravel Excel 3.1 passing data from controller to class

I have upgraded the laravel excel library (Maatswebsite) from 2x to 3.1 (running Laravel 5.6/php 7.1) and trying to make my old data work (download exported file) and cannot work out how to pass my $data (which is an array from a foreach DB query (not eloquent) in controller) to the UsersExport.php class...

If I manually create a test collection (mirroring my $data array) in the class:

return collect([
    [
        'name' => 'F Name 1',
        'surname' => 'Last Name 1',
        'email' => 'Email 1'
        'date_completed' => 'xx/xx/xx'
    ],
    [
        'name' => 'F Name 2',
        'surname' => 'Last Name 2',
        'email' => 'Email 2',
        'date_completed' => 'xx/xx/xx'
    ]
]);

the above works perfect and the file is created and downloads when I run:

return Excel::download(new UsersExport, 'Test.xlsx');

But I want to pass my array ($data) from the controller to the class and not sure HOW I do this... I am trying to get something like this to work:

return Excel::download(new UsersExport($data), 'Test.xlsx');

From reading the specific posts I could find, I believe I need to create a constructor in the Class to accept my $data - but not sure how, and how to return that data if I succeed in my class accepting the data etc... Is the FromCollection the right option?

   private $data;

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

Appreciate any assistance.... Thanks in advance.

Upvotes: 0

Views: 1776

Answers (2)

Sam
Sam

Reputation: 51

if you want passing param data to class you use construct.

Example Controller:

 <?php
    namespace App\Http\Controllers\Reports;
    
    use App\Http\Controllers\Controller;
    use Maatwebsite\Excel\Facades\Excel;
    use App\Exports\CustomerinvoiceExport;
    use App\Model\OrderInvoiceList;
    use Illuminate\Http\Request;
    
    class CustomerInvoiceController extends Controller
    {
        public function index(Request $request)
        {
 
            if ($request->has('start_date')) {
                $start_date = $request->start_date;
            } else {
                $date_now = Carbon::now();
                $start_date = $date_now->toDateString();
            }
            if ($request->has('end_date')) {
                $end_date = $request->end_date;
            } else {
                $date_now = Carbon::now();
                $end_date = $date_now->toDateString();
            }
            $customer_invs = OrderInvoiceList::customer_invoice($start_date, $end_date);
    
                return Excel::download(new CustomerinvoiceExport($customer_invs), 'Customer_Invoice_Report.xlsx');
        }
    }
    }

Class Export

<?php

namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;


class CustomerinvoiceExport implements FromCollection
{

    protected $customer_invs;
    
    /**
     * Customer Invoice Report
     */
    public function __construct($customer_invs)
    {

        $this->customer_invs = $customer_invs;
    }
    /**
    * @return invoice_list
    */
    public function collection(): array
    {
     $invoice_list = $this->invoice_list;
      ...........your logic here....
    }
}

Upvotes: 0

Tharaka Dilshan
Tharaka Dilshan

Reputation: 4499

Your approach is right. then use the collection() function to return that data.

private $data;

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

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

Upvotes: 1

Related Questions