Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

NadeemAkhter's avatar

Intersection between two query result

i have two query result

if($request->has('city'))
 {
  $data1=$this->vehicle->searchVehiclesByGeneralFilter('cities',$request->city);
 }

 if($request->has('engine_type'))
 {
  $data2=$this->vehicle->searchVehiclesByGeneralFilter('engine_types',$request->engine_type);
 }

i want only common rows in these two arrays $data1 ,$data2

0 likes
10 replies
NadeemAkhter's avatar

these may be a paginator obejcts like

LengthAwarePaginator {#282 ▼ #total: 4 #lastPage: 1 #items: Collection {#281 ▶} #perPage: 35 #currentPage: 1 #path: "http://localhost:8000/UsedCar/Search" #query: [] #fragment: null #pageName: "page" }

JackJones's avatar

If they are both using the same method why would you perform two queries and then intersect the results? Why wouldn't you apply both conditions to the query?

1 like
sanderwind's avatar

Explain a bit more about the variable $this->vehicle and its method searchVehiclesByGeneralFilter()... What kind of variable is it and what does the method do?

If it's a Eloquent Model you could create a new scope and expand the query with two where statements.

1 like
NadeemAkhter's avatar

this method return the database result

here is the definitionn of mehtod(searchVehiclesByGeneralFilter():

{ return $data=DB::table('vehicles') ->where([[$col.'.id',$id],['vehicles.condition',"used"],['images.size','s'],['status','approved']]) ->join('vehicle_types','vehicle_types.id','=' , 'vehicles.vehicle_type_id') ->join('manufactures','manufactures.id' , '=' , 'vehicles.manufacture_id') ->join('brands','brands.id','=','manufactures.brand_id') ->join('models','models.id' , '=' , 'vehicles.model_id') ->join('vehicle_body_types','vehicle_body_types.id','=','models.bodytype_id') ->join('model_versions','model_versions.id','=','vehicles.model_version_id') ->join('cities','cities.id' , '=' , 'vehicles.city_id') ->select('vehicles.*','vehicle_types.title as vehicle_type','brands.title as manufacture','models.title as model','model_versions.title as model_version','cities.title as city','images.url','transmissions.title as transmission','assemblies.title as assembly','vehicle_body_types.title as body_type','registration_cities.title as reg_city') ->orderby('vehicles.featured','desc') ->paginate(35); }

NadeemAkhter's avatar

#JackJones we don't know the request parameter is set or not!.. and we have 8 parameters in request object. basically we want the functionality of search filters.

NadeemAkhter's avatar

#bandjes

return $data=DB::table('vehicles')
  ->where([[$col.'.id',$id],['vehicles.condition',"used"],['images.size','s'],['status','approved']])
   ->join('vehicle_types','vehicle_types.id','=' , 'vehicles.vehicle_type_id')
  ->join('manufactures','manufactures.id' , '=' , 'vehicles.manufacture_id')
  ->join('brands','brands.id','=','manufactures.brand_id')
  ->join('models','models.id' , '=' , 'vehicles.model_id')
  ->join('vehicle_body_types','vehicle_body_types.id','=','models.bodytype_id')
  ->join('model_versions','model_versions.id','=','vehicles.model_version_id')
  ->join('cities','cities.id' , '=' , 'vehicles.city_id')
  ->join('images','images.post_id' , '=' , 'vehicles.id')
  ->join('transmissions','transmissions.id','=','vehicles.transmission_id')
  ->join('assemblies','assemblies.id','=','vehicles.assembly_id')
  ->join('engine_types','engine_types.id','=','vehicles.engine_type_id')
  ->join('registration_cities','registration_cities.id','=','vehicles.reg_city_id')
  ->select('vehicles.*','vehicle_types.title as vehicle_type','brands.title as manufacture','models.title as model','model_versions.title as model_version','cities.title as city','images.url','transmissions.title as transmission','assemblies.title as assembly','vehicle_body_types.title as body_type','registration_cities.title as reg_city')
  ->orderby('vehicles.featured','desc')
  ->paginate(35);
sanderwind's avatar
Level 2

For your current situation I would try to use something like this;

function searchVehiclesByGeneralFilter(array $filters = [])
{
    $query = DB::table('vehicles');

    foreach ($filters as $col => $id) {
        $query->where($col . '.id', $id);
    }

    $query->where('vehicles.condition', 'used')
        ->where('images.size', 's')
        ->where('status', 'approved')
        ->join('vehicle_types', 'vehicle_types.id', '=' , 'vehicles.vehicle_type_id')
        ->join('manufactures', 'manufactures.id' , '=' , 'vehicles.manufacture_id')
        ->join('brands', 'brands.id', '=', 'manufactures.brand_id')
        ->join('models', 'models.id' , '=' , 'vehicles.model_id')
        ->join('vehicle_body_types', 'vehicle_body_types.id', '=', 'models.bodytype_id')
        ->join('model_versions', 'model_versions.id', '=', 'vehicles.model_version_id')
        ->join('cities', 'cities.id' , '=' , 'vehicles.city_id')
        ->join('images', 'images.post_id' , '=' , 'vehicles.id')
        ->join('transmissions', 'transmissions.id', '=', 'vehicles.transmission_id')
        ->join('assemblies', 'assemblies.id', '=', 'vehicles.assembly_id')
        ->join('engine_types', 'engine_types.id', '=', 'vehicles.engine_type_id')
        ->join('registration_cities', 'registration_cities.id', '=', 'vehicles.reg_city_id')
        ->select(
            'vehicles.*',
            'vehicle_types.title as vehicle_type',
            'brands.title as manufacture',
            'models.title as model',
            'model_versions.title as model_version',
            'cities.title as city',
            'images.url',
            'transmissions.title as transmission',
            'assemblies.title as assembly',
            'vehicle_body_types.title as body_type',
            'registration_cities.title as reg_city'
        )
        ->orderby('vehicles.featured', 'desc');

    return $query->paginate(35);
}

Then you can call it like this;

$filters = [];

if ($request->has('city')) {
    $filters['cities'] = $request->city;
}

if ($request->has('engine_type')) {
    $filters['engine_types'] = $request->engine_type;
}

$paginated_data = $this->vehicle->searchVehiclesByGeneralFilter($filters);

Still, recommended is to use the Eloquent Query Builder. You can easily build relationships (joins), scopes and filters for this kind of situations.

NadeemAkhter's avatar

@bandjes Thanks. i think it works perfectly. i don't have much knowledge about Eloquent Query Builder.

Please or to participate in this conversation.