Search code examples
phplaraveldatabaseeloquentlaravel-query-builder

Fetch data when you have multiple search queries in laravel


I have this type of modal for search data from the database.

Image

enter image description here

I want to search the data if the user only types company name and CIN or *company name only or company state and company district user can choose any field. So I want to fetch the data only on selected fields.

Is there any simplest way to do this

I have coded multiple if-else statements.

My Code

 else if ($req->state && $req->district) {
            $data = tbl_company::query()
                ->where(
                    "state",
                    "LIKE",
                    "%{$req->state}%"
                )->where(
                    "district",
                    "LIKE",
                    "%{$req->district}%"
                )
                ->paginate(100);
        }

        // Filter using only state and city

        else if ($req->city && $req->district && $req->state == null) {
            $data = tbl_company::query()
                ->where(
                    "city",
                    "LIKE",
                    "%{$req->city}%"
                )->where(
                    "district",
                    "LIKE",
                    "%{$req->district}%"
                )
                ->paginate(100);
        }

        // company status only
        else if ($req->company_status && $req->city == null && $req->district == null && $req->state == null) {
            $data = tbl_company::query()
                ->where(
                    "company_status",
                    $req->company_status
                )
                ->paginate(100);
        }

Solution

  • use Conditional Clauses

    $data = tbl_company::query()->when($req->state && $req->district, function ($query, $req) {
            $query->where("state", "LIKE", "%{$req->state}%")
                ->where("district", "LIKE", "%{$req->district}%");
        })->when($req->city && $req->district && $req->state == null, function ($query, $req) {
    
            $query->where("city", "LIKE", "%{$req->city}%")
                ->where("district", "LIKE", "%{$req->district}%");
        })->paginate(100);
    

    Updates use loop

    $data = tbl_company::query()->where(function ($query)use($req){
        foreach ($req->only('state','district','city','company_status') as $filterField=>$filterFieldValue){
            if(!empty($filterFieldValue)&&is_array($filterFieldValue)){
                $query->wherein($filterField,$filterFieldValue);
            }elseif (!empty($filterFieldValue)){
                $query->where($filterField, "LIKE", "%{$filterFieldValue}%");
            }
        }
    })->paginate(100);