Reputation: 179
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
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
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