Search code examples
laraveleloquentlaravel-7

Laravel query with relationship where have all ids


I try to do a query where I get a room where I have all the services.

With my current code I get the room that has at least one of the services from the array, because I am using whereIn.

$rooms = Room::select([
    'rooms.id',
    'rooms.available_from',
    'rooms.available_till',
    'rooms.description',
    'rooms.room_type_id',
    'room_types.name as room_types_name',
])
    ->leftJoin('room_types', 'room_types.id', 'rooms.room_type_id')
    ->with('services','reserved_rooms')
    ->when($request->services, function ($query) use ($request) {
        $query->whereHas('services', function ($q) use ($request) {
            $q->whereIn('id', $request->services);
        });
    })
    ->orderByDesc('id')
    ->get();

Solution

  • If you want to match all services, you can use for loop to create AND query.

    Try below code:

    ->when($request->services, function ($query) use ($request) {
        foreach ($request->services as $key => $service) {
            $query->whereHas('services', function ($q) use ($service) {
                $q->where('id', $service);
            });
        }
    })