Got the answer from stack overflow:
https://stackoverflow.com/questions/72681431/how-to-pass-2-parameters-in-a-scopefilter-query
Yes, you are missing how to inherit variables from the parent scope. That's is basic knowledge about anonymous function in PHP.
You need to use ($mealType), so the correct code should be like:
public function scopeFilter($query, array $filters)
{
$mealType = $filters['mealType'] ?? null;
$serviceDate = $filters['serviceDate'] ?? null;
$query
->when($mealType, function($query) use ($mealType,$serviceDate) {
$query->whereDoesntHave('student_meals', fn($query) => $query->where('meal_type_id', $mealType)
->where('void', false)
->where('date_served', $serviceDate)
);
});
}