Reputation: 23
I have search page and there is 3 select lists as input. when user select one or more option and click search button, page will show result that match one or more of this parameters and ignore empty parameters.
I tried to use :
if($request->country != null)
{
$searchResult = DB::table('table_name')->where('country', $request->country);
}
if($request->name != null)
{
$searchResult = DB::table('table_name')->where('name', $request->name );
}
if($request->city != null)
{
$searchResult = DB::table('table_name')->where('city', $request->city);
}
How i can show results when one or more parameters is empty. and merge results in one collection. Or is there any solution better that this.
Thank you in advance
Upvotes: 0
Views: 530
Reputation: 18926
Simple use whereOr()
logic, then its either by country, name or city. This will automatically deal with merging into one collection problem.
$searchResult = DB::table('table_name')->where('country', $request->country)
->orWhere('name', $request->name )
->orWhere('city', $request->city);
To avoid empty parameters, use when()
function, that only will execute when the condition is true.
$searchResult = DB::table('table_name')
->when($request->country, function ($query) use ($request) {
$query->orWhere('country', $request->country);
})->when($request->name, function ($query) use ($request) {
$query->orWhere('name', $request->name);
})->when($request->city, function ($query) use ($request) {
$query->orWhere('city', $request->city);
});
Upvotes: 2
Reputation: 1088
If You want to skip unavailable search parameters you can use.
$query=DB::table('table_name');
switch (true){
case isset($request->country);
$query->where('country',$request->country);
continue;
case isset($request->city);
$query->where('city',$request->city);
continue;
case isset($request->name);
$query->where('name',$request->name);
}
$result= $query->get();
Upvotes: 0