Laravel: validate an integer field that needs to be greater than another

There is no built-in validation that would let you compare field values like that in Laravel, so you'll need to implement a custom validator, that will let you reuse validation where needed. Luckily, Laravel makes writing custom validator really easy.

Start with defining new validator in yor AppServiceProvider:

class AppServiceProvider extends ServiceProvider
{
  public function boot()
  {
    Validator::extend('greater_than_field', function($attribute, $value, $parameters, $validator) {
      $min_field = $parameters[0];
      $data = $validator->getData();
      $min_value = $data[$min_field];
      return $value > $min_value;
    });   

    Validator::replacer('greater_than_field', function($message, $attribute, $rule, $parameters) {
      return str_replace(':field', $parameters[0], $message);
    });
  }
}

Now you can use your brand new validation rule in your $rules:

$rules = [
  'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
  'end_page' => 'required_with:initial_page|integer|greater_than_field:initial_page|digits_between:1,5'
]; 

You'll find more info about creating custom validators here: http://laravel.com/docs/5.1/validation#custom-validation-rules. They are easy to define and can then be used everywhere you validate your data.


the question was asked in 2015 so most of the answers are also outdated now in 2019

i want to give answer which uses features provided by laravel team which is included in it's new version,

so as stated by @Sarpadoruk as of laravel 5.6 laravel added features in validation like gt,gte,lt and lte which means:

  • gt - greater than
  • gte - greater than equal to
  • lt - less than
  • lte - less than equal to

so using gt you can check that your end_page should be greater than your initial_page and your task becomes very easy now:

$rules = [
  'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
  'end_page' => 'required_with:initial_page|integer|gt:initial_page|digits_between:1,5'
]; 

For Laravel 5.4 it will be:

$rules = ['end_page'=>'min:'.(int)$request->initial_page]