your query could look like that :
$bookings = Booking::where('status', '!==', Booking::STATUS_CANCELED)
->where(function ($q) use ($start, $end) {
$q->where('started_at', '<=', $end)
->orWhere('started_at', '>=', $start);
})
->orWhere(function ($q) use ($start, $end) {
$q->where('ends_at', '>=', $start)
->where('ends_at', '<=', $end);
})->orWhere(function ($q) use ($start, $end) {
$q->where('started_at', '<', $start)
->where('ends_at', '>', $end);
})->get();
I think I found a solution :
$bookings = DB::table('bookings')
->where(function ($q) use ($start, $end) {
$q->where('started_at', '>=', $start)
->where('started_at', '<=', $end);
})
->orWhere(function ($q) use ($start, $end) {
$q->where('ends_at', '>=', $start)
->where('ends_at', '<=', $end);
})
->orWhere(function ($q) use ($start, $end) {
$q->where('started_at', '<', $start)
->where('ends_at', '>', $end);
})
->count();