Abdullah
Abdullah

Reputation: 23

Search in table using one or more of 3 parameters laravel

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

Answers (2)

mrhn
mrhn

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

M.abdelrhman
M.abdelrhman

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

Related Questions