PHPackages                             dazza-dev/laravel-batch-validation - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Validation &amp; Sanitization](/categories/validation)
4. /
5. dazza-dev/laravel-batch-validation

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

dazza-dev/laravel-batch-validation
==================================

Batch validate arrays in Laravel and optimize database unique rules using whereIn to avoid N+1 query issues.

v2.2.0(2mo ago)21966—7.5%1MITPHPPHP &gt;=8.2

Since May 28Pushed 2mo ago1 watchersCompare

[ Source](https://github.com/dazza-dev/Laravel-Batch-Validation)[ Packagist](https://packagist.org/packages/dazza-dev/laravel-batch-validation)[ RSS](/packages/dazza-dev-laravel-batch-validation/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (4)Dependencies (8)Versions (6)Used By (0)

Laravel Batch Validation
========================

[](#laravel-batch-validation)

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
-------

[](#install)

```
composer require dazza-dev/laravel-batch-validation
```

Usage
-----

[](#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
----------

[](#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
--------------

[](#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
------------

[](#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-and-after-optimization)

### Before (N+1 problem)

[](#before-n1-problem)

[![Before Optimization](https://private-user-images.githubusercontent.com/21293561/404085205-e1c8c3a6-d7eb-423b-8448-8d5cc6e2d968.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODY3NTk1NDIsIm5iZiI6MTc4Njc1OTI0MiwicGF0aCI6Ii8yMTI5MzU2MS80MDQwODUyMDUtZTFjOGMzYTYtZDdlYi00MjNiLTg0NDgtOGQ1Y2M2ZTJkOTY4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA4MTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwODE1VDAyMDA0MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk5MTNjYTE1YzkxY2JiODg2MjU5MTFkYmI0NmY3Zjk1ZWNjMTQ2YjMyYWM0YjYyMjA0MjJmNjgwYjI5ZWViZjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.v3hXY-TknxYjH2CHxtOcqXYoV5NgXgAYL47zVRATsl0)](https://private-user-images.githubusercontent.com/21293561/404085205-e1c8c3a6-d7eb-423b-8448-8d5cc6e2d968.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODY3NTk1NDIsIm5iZiI6MTc4Njc1OTI0MiwicGF0aCI6Ii8yMTI5MzU2MS80MDQwODUyMDUtZTFjOGMzYTYtZDdlYi00MjNiLTg0NDgtOGQ1Y2M2ZTJkOTY4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA4MTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwODE1VDAyMDA0MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk5MTNjYTE1YzkxY2JiODg2MjU5MTFkYmI0NmY3Zjk1ZWNjMTQ2YjMyYWM0YjYyMjA0MjJmNjgwYjI5ZWViZjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.v3hXY-TknxYjH2CHxtOcqXYoV5NgXgAYL47zVRATsl0)

### After (Optimized)

[](#after-optimized)

[![After Optimization](https://private-user-images.githubusercontent.com/21293561/404085204-4c2353a1-4571-440c-90a4-d7221ec64a44.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODY3NTk1NDIsIm5iZiI6MTc4Njc1OTI0MiwicGF0aCI6Ii8yMTI5MzU2MS80MDQwODUyMDQtNGMyMzUzYTEtNDU3MS00NDBjLTkwYTQtZDcyMjFlYzY0YTQ0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA4MTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwODE1VDAyMDA0MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU4YWRmOWI1ZTZmMjA0ZThlNmY2OGY3MTAxMWViMWNkMjQ5ZDgzMTYwOTIwZjViZDQ1MWZjNGNjZWZkOTQ4YjUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.QbLPaq5ShLKBc-x3LsPUvgLlaUZLP7kKZoWjIU497Tg)](https://private-user-images.githubusercontent.com/21293561/404085204-4c2353a1-4571-440c-90a4-d7221ec64a44.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODY3NTk1NDIsIm5iZiI6MTc4Njc1OTI0MiwicGF0aCI6Ii8yMTI5MzU2MS80MDQwODUyMDQtNGMyMzUzYTEtNDU3MS00NDBjLTkwYTQtZDcyMjFlYzY0YTQ0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA4MTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwODE1VDAyMDA0MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU4YWRmOWI1ZTZmMjA0ZThlNmY2OGY3MTAxMWViMWNkMjQ5ZDgzMTYwOTIwZjViZDQ1MWZjNGNjZWZkOTQ4YjUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.QbLPaq5ShLKBc-x3LsPUvgLlaUZLP7kKZoWjIU497Tg)

Contributions
-------------

[](#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
------

[](#author)

Laravel Batch Validation was created by [DAZZA](https://github.com/dazza-dev).

License
-------

[](#license)

This project is licensed under the [MIT License](https://opensource.org/licenses/MIT).

###  Health Score

46

—

FairBetter than 92% of packages

Maintenance87

Actively maintained with recent releases

Popularity23

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 90% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~95 days

Total

5

Last Release

65d ago

Major Versions

v1.0.0 → v2.0.02025-09-16

PHP version history (2 changes)1.x-devPHP &gt;=7.4

v2.1.0PHP &gt;=8.2

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/21293561?v=4)[Dazza](/maintainers/dazza-dev)[@dazza-dev](https://github.com/dazza-dev)

---

Top Contributors

[![dazza-dev](https://avatars.githubusercontent.com/u/21293561?v=4)](https://github.com/dazza-dev "dazza-dev (18 commits)")[![reinerttomas](https://avatars.githubusercontent.com/u/9898614?v=4)](https://github.com/reinerttomas "reinerttomas (2 commits)")

---

Tags

laravelvalidationbatch

###  Code Quality

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/dazza-dev-laravel-batch-validation/health.svg)

```
[![Health](https://phpackages.com/badges/dazza-dev-laravel-batch-validation/health.svg)](https://phpackages.com/packages/dazza-dev-laravel-batch-validation)
```

###  Alternatives

[unopim/unopim

UnoPim Laravel PIM

10.8k2.5k](/packages/unopim-unopim)[crazybooot/base64-validation

Laravel validators for base64 encoded files

1352.1M8](/packages/crazybooot-base64-validation)[api-platform/laravel

API Platform support for Laravel

58190.1k21](/packages/api-platform-laravel)[carsdotcom/laravel-json-schema

Json Schema validation for Laravel projects

1045.1k8](/packages/carsdotcom-laravel-json-schema)[ecotone/laravel

Ecotone for Laravel — CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.

21327.3k4](/packages/ecotone-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
