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

noblemfd's avatar

How to make my excel to export filter by parameters

I am using Maatwebsites-3.1 for excel export in Laravel-5.8 project. I have this model:

class BbnaijaGameWinners extends Model
{
    protected $table = 'bbnaija_game_winners';

    protected $fillable = [
        'game_id',
        'result',
        'created_at',
        'updated_at',
    ];    


    protected $guarded = [
        'id'
    ];

    public function game() {
        return $this->belongsTo('App\BbnaijaGames');
    } 

    public function relGame()
    {
        return $this->belongsTo('App\BbnaijaGames','game_id','id');
    }    

Controller

public function gamewinnerReport(Request $request)
{
    $data['title'] = 'Game Winner Report';
    $winners= new BbnaijaGameWinners();
    $winners=$winners->with('relGame');
    
    $start_date = $request->start_date;
    $end_date = $request->end_date; 
    
    $render=[];
    if(isset($request->start_date) && isset($request->end_date))
    {
        $winners=$winners->whereBetween('created_at',[$start_date.' 00:00:00',$end_date.' 23:59:59']);
        $render['start_date']=$request->start_date;
        $render['end_date']=$request->end_date;
    }elseif(isset($request->start_date))
    {
        $winners=$winners->where('created_at',$request->start_date);
        $render['start_date']=$request->start_date;
    }
    if(isset($request->game_id))
    {
        $winners=$winners->where('game_id',$request->game_id);
        $render['game_id']=$request->game_id;
    }
    $winners= $winners->paginate(15);
    $winners= $winners->appends($render);
    $data['winners'] = $winners;
    $data['games']=BbnaijaGames::pluck('game_name','id');
    $data['games2']=BbnaijaGames::pluck('game_code','id');
    return view('report.gamewinnerReport',$data);
}

public function exportwinners() 
{
    return Excel::download(new WinnersExport, 'winners.xlsx');
} 

View

<div class="row" style="margin-bottom: 10px">
    {{ Form::model(request(),['method'=>'get']) }}
    <div class="col-sm-2">
         {{ Form::select('game_id',$games,null,['class'=>'form-control','placeholder'=>'Select Game Name']) }}
    </div>
    <div class="col-sm-2">
         {{ Form::select('game_id',$games2,null,['class'=>'form-control','placeholder'=>'Select Game Code']) }}
    </div>        
    <div class="col-sm-3">
        {{ Form::date('start_date',null,['class'=>'form-control','placeholder'=>'Date']) }}
    </div>
    <div class="col-sm-3">
        {{ Form::date('end_date',null,['class'=>'form-control','placeholder'=>'Date']) }}
    </div>          
    <div class="col-xs-2">
        {{ Form::submit('Search',['class'=>'btn btn-warning']) }}
        <a href="{{ route('winnersexport') }}" class="btn btn-primary"><i class="fa fa-file-excel-o"></i> Excel</a>
    </div>
    {{ Form::close() }}
</div>

From my Controller and view, I filtered by created_at (start_date and end_date), game_id. Everything works perfectly and it displays on the view blade table.

However, the excel export is not working that way. When the user clicks the excel button, it sends everything in the DB table to the excel.

class WinnersExport implements FromQuery, WithHeadings, ShouldAutoSize, WithEvents
{
    /**
    * @return \Illuminate\Support\Collection
    */

    use Exportable;
//    public function collection()
//    {
//        return BbnaijaGameWinners::all();
//    }

    private $headings = [
        'Date', 
        'Title',
        'Game',
        'Result',
    ];

    public function query()
    {
        return BbnaijaGameWinners::query()->select('bbnaija_game_winners.created_at','Bbnaija_games.title','Bbnaija_games.game_code','bbnaija_game_winners.result')
                    ->join('Bbnaija_games','Bbnaija_games.id', '=', 'bbnaija_game_winners.game_id')
                    ->orderBy('bbnaija_game_winners.created_at', 'DESC');
    }

    public function headings() : array
    {
        return $this->headings;
    }   

    public function registerEvents(): array
    {
        return [
            AfterSheet::class    => function(AfterSheet $event) {
                $cellRange = 'A1:D1'; // All headers
                $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(14);
            },

        ];
    } 

}

How do I make my Excel to export based on filter parameter created_at (start_date and end_date) and game_id as it is in the controller?

Thank you

0 likes
0 replies

Please or to participate in this conversation.