Irshad Khan
Irshad Khan

Reputation: 179

How to search from database with multiple optional parameter in laravel?

i am using Laravel 8 and perform search operation. I am searching data on base of (Vendor id,Date,Amount). It is possible if three option exist or one. I have tried and i see my attempt is not good. My code is

if ($request->has('date') && $request->has('vendor') && $request->has('amount')){

return Auth::user()->invoices()->whereDate('invoice_date', Carbon::parse($request->date))
                          ->where('invoice_net_total', $request->amount)
                          ->where('vendor_id', $request->vendor)
                          ->get();

    }elseif ($request->has('date') && $request->has('vendor')){

   return Auth::user()->invoices()->whereDate('invoice_date', Carbon::parse($request->date))
                           ->where('vendor_id', $request->vendor)
                           ->get();
    }else{
        return Auth::user()->invoices()->where('invoice_net_total', $request->amount)
            ->get();
    }

and so on. Kinldy tell me the best way for searching. Thanks

Upvotes: 0

Views: 453

Answers (2)

pr1nc3
pr1nc3

Reputation: 8338

when will solve all your problems. It was build specific for that. You can encapsulate all your if statements inside when clauses like:

$vendor = $request->vendor;
$date = $request->date;
$amount = $request->amount;

Auth::user()->invoices()->when(($request->has('vendor')), function (Builder $q) use ($vendor) 
{
    return $q->where('vendor_id', $vendor)
})
->when(($request->has('date')), function (Builder $q) use ($date) 
            {
                    return $q->whereDate('invoice_date', Carbon::parse($date));
            })
            ->when(($request->has('amount')), function (Builder $q) use ($amount) {
                return $q->where('total_amount', $amount)
            })
->get();

Upvotes: 0

Donkarnash
Donkarnash

Reputation: 12835

You can try

$query = Auth::user()->invoices();

if($request->has('date') && !empty($request->date)) {
    $query->whereDate('invoice_date', Carbon::parse($request->date));
}

if($request->has('amount') && !empty($request->amount)) {
    $query->where('invoice_net_total', $request->amount);
}

if($request->has('vendor') && !empty($request->vendor)) {
    $query->where('vendor_id', $request->vendor);
}

return $query->get();

Upvotes: 1

Related Questions