Since the value of semester is required, you could add a custom validation rule:
https://laravel.com/docs/5.4/validation#custom-validation-rules
Maybe call it unique_to_semester ? then your rules would look like:
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users|unique:admins|unique:teachers',
'password' => 'required|min:6|confirmed',
'roll' => 'required|integer|min:0|unique:users|unique_to_semester',
'semester' => 'required'
]);
I think you can use the request() function inside the extend callback to get information from any input - but i'm not 100%, sorry!
Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
// If semester isn't set, this rule isn't valid.
if (empty(request('semester')) {
return false;
}
// Check that the "roll" ($value) is unique only to that semester.
// return true if it passes the test
// return false if it doesn't
});