Это некрасиво, но я думаю, что-то подобное должно работать
Model::where(function($query) use ($date){
$query->where('start_date', '<=', $date)
->where('end_date', '>=', $date);
})->orWhere(function($query) use ($date) {
$query->where('start_date', '<=', $date)
->whereNull('end_date');
})->get()
Редактировать Поскольку вам нужны другие условия, вам нужно обернуть это условие
Model::query()
->where(function($query) use ($date) {
$query->where(function($query) use ($date){
$query->where('start_date', '<=', $date)
->where('end_date', '>=', $date);
})->orWhere(function($query) use ($date) {
$query->where('start_date', '<=', $date)
->whereNull('end_date');
})
})
->where('another_column', true)
->get()
```