dazza-dev / laravel-batch-validation
Batch validate arrays in Laravel and optimize database unique rules using whereIn to avoid N+1 query issues.
Requires
- php: >=7.4
- laravel/framework: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- larastan/larastan: ^2.0
- laravel/pint: ^1.18
- orchestra/testbench: ^8.27
README
When performing array validations in Laravel with unique rules, Laravel validates one record at a time, causing an N+1 query problem. This is a common issue when importing data from an Excel file and validating it before inserting it into the database. This package solves the problem by batching the unique validations and using whereIn to prevent the N+1 problem.
Install
composer require dazza-dev/laravel-batch-validation
Usage
This package is easy to use. Here's an example of how to apply it:
use Illuminate\Support\Facades\Validator; $data = [ ['name' => 'User 1', 'email' => 'user1@example.com'], ['name' => 'User 2', 'email' => 'user2@example.com'], ['name' => 'User 3', 'email' => 'user3@example.com'], ]; // Validator Instance $validator = Validator::make($data, [ '*.name' => 'required', '*.email' => 'email:strict|unique:contacts,email', ]); // Validate in Batches (this prevent n+1 problem) $validator->validateInBatches(); // Validation fails if ($validator->fails()) { throw new \Exception(json_encode($validator->errors()->messages())); }
Batch Size
You can change the batch size by passing the batchSize
parameter to the validateInBatches
method. The default batch size is 10.
$validator->validateInBatches(batchSize: 20);
Database Rules
This package also supports database rules like unique
, exists
.
$validator = Validator::make($data, [ '*.name' => 'required', '*.email' => 'email:strict|unique:contacts,email', ]);
Form Request
You can use the validateInBatches
method in a form request.
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Validator; class StoreContactRequest extends FormRequest { public function rules(): array { return [ '*.name' => 'required', '*.email' => 'email:strict|unique:contacts,email', ]; } public function withValidator(Validator $validator) { if (method_exists($validator, 'validateInBatches')) { $validator->validateInBatches(batchSize: 100); } } }
Before and After Optimization
Before (N+1 problem)
After (Optimized)
Contributions
Contributions are welcome. If you find any bugs or have ideas for improvements, please open an issue or send a pull request. Make sure to follow the contribution guidelines.
Author
Laravel Batch Validation was created by DAZZA.
License
This project is licensed under the MIT License.