PHPackages                             denizgolbas/laravel-equality-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. [Database &amp; ORM](/categories/database)
4. /
5. denizgolbas/laravel-equality-validation

ActiveLibrary[Database &amp; ORM](/categories/database)

denizgolbas/laravel-equality-validation
=======================================

A powerful Laravel validation rule for checking equality between reference and target model columns. Perfect for validating relationships, matching codes, currencies, and ensuring data consistency across related models.

v1.0.0(4mo ago)00MITPHPPHP ^8.1CI passing

Since Jan 2Pushed 4mo agoCompare

[ Source](https://github.com/denizgolbas/laravel-equality-validation)[ Packagist](https://packagist.org/packages/denizgolbas/laravel-equality-validation)[ Docs](https://github.com/denizgolbas/laravel-equality-validation)[ RSS](/packages/denizgolbas-laravel-equality-validation/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (1)Dependencies (5)Versions (2)Used By (0)

Laravel Equality Validation
===========================

[](#laravel-equality-validation)

[![Tests](https://github.com/denizgolbas/laravel-equality-validation/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/denizgolbas/laravel-equality-validation/actions/workflows/tests.yml)[![Packagist](https://camo.githubusercontent.com/e7811bd22bc71388b6f96fd4a42ce77c5a7aaf20c593e27115b42e0d88cf589e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f64656e697a676f6c6261732f6c61726176656c2d657175616c6974792d76616c69646174696f6e2e737667)](https://packagist.org/packages/denizgolbas/laravel-equality-validation)[![Packagist Downloads](https://camo.githubusercontent.com/d4aacc6fb85573dd29fd6c912a15c4c51a7605561c30a3f8e8b1e9dda3af09c0/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f64656e697a676f6c6261732f6c61726176656c2d657175616c6974792d76616c69646174696f6e2e737667)](https://packagist.org/packages/denizgolbas/laravel-equality-validation)[![License](https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667)](LICENSE)[![PHP Version](https://camo.githubusercontent.com/95b285c9acc2f34f2f83097df3ec1ca642aa8512b34ee87fc9b73800be79fbe8/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f64656e697a676f6c6261732f6c61726176656c2d657175616c6974792d76616c69646174696f6e2e737667)](https://packagist.org/packages/denizgolbas/laravel-equality-validation)[![Laravel Version](https://camo.githubusercontent.com/b7bd8c10f88035d2b0039e09cc47b4c71a6f3d85267e3efe9a9118631e0e8dae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d31302e7825323025374325323031312e782d7265642e737667)](https://laravel.com)

A powerful Laravel validation rule for checking equality between reference and target model columns. Perfect for validating relationships, matching codes, currencies, and ensuring data consistency across related models.

Installation
------------

[](#installation)

You can install the package via Composer:

```
composer require denizgolbas/laravel-equality-validation
```

The package will automatically register its service provider.

Configuration
-------------

[](#configuration)

You can publish the config file with:

```
php artisan vendor:publish --tag=equality-validation-config
```

Usage
-----

[](#usage)

This validation rule allows you to validate that a column value from a reference model matches a column value from a target model.

### Example 1: Basic Request Validation

[](#example-1-basic-request-validation)

```
use Illuminate\Http\Request;
use DenizGolbas\LaravelEqualityValidation\EqualityValidationRule;
use App\Models\Order;
use App\Models\Invoice;

public function store(Request $request)
{
    $request->validate([
        'order_id' => [
            'required',
            'exists:orders,id',
            new EqualityValidationRule(
                Order::class,        // Reference model
                'code',              // Reference column
                Invoice::class,      // Target model
                'code',              // Target column
                'invoice_id'         // Target attribute name
            ),
        ],
        'invoice_id' => 'required|exists:invoices,id',
    ]);

    // Your logic here
}
```

### Example 2: Using FormRequest Class

[](#example-2-using-formrequest-class)

```
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use DenizGolbas\LaravelEqualityValidation\EqualityValidationRule;
use App\Models\Order;
use App\Models\Invoice;

class CreateOrderInvoiceRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'order_id' => [
                'required',
                'exists:orders,id',
                new EqualityValidationRule(
                    Order::class,
                    'code',
                    Invoice::class,
                    'code',
                    'invoice_id'
                ),
            ],
            'invoice_id' => 'required|exists:invoices,id',
        ];
    }
}
```

### Example 3: Validating Warehouse and Product Location

[](#example-3-validating-warehouse-and-product-location)

```
use Illuminate\Http\Request;
use DenizGolbas\LaravelEqualityValidation\EqualityValidationRule;
use App\Models\Warehouse;
use App\Models\Product;

public function transferProduct(Request $request)
{
    $request->validate([
        'from_warehouse_id' => [
            'required',
            'exists:warehouses,id',
            new EqualityValidationRule(
                Warehouse::class,
                'location_code',
                Product::class,
                'current_location',
                'product_id',
                false // sameLine = false, because product_id is at root level
            ),
        ],
        'product_id' => 'required|exists:products,id',
        'to_warehouse_id' => 'required|exists:warehouses,id',
    ]);

    // Transfer logic
}
```

### Example 4: Validating Multiple Items in Array

[](#example-4-validating-multiple-items-in-array)

```
use Illuminate\Http\Request;
use DenizGolbas\LaravelEqualityValidation\EqualityValidationRule;
use App\Models\Order;
use App\Models\Invoice;

public function createBulkInvoices(Request $request)
{
    $request->validate([
        'items.*.order_id' => [
            'required',
            'exists:orders,id',
            new EqualityValidationRule(
                Order::class,
                'code',
                Invoice::class,
                'code',
                'items.*.invoice_id'
            ),
        ],
        'items.*.invoice_id' => 'required|exists:invoices,id',
    ]);

    // Process bulk invoices
}
```

### Example 5: Validating User and Company Relationship

[](#example-5-validating-user-and-company-relationship)

```
use Illuminate\Http\Request;
use DenizGolbas\LaravelEqualityValidation\EqualityValidationRule;
use App\Models\User;
use App\Models\Company;

public function assignUserToCompany(Request $request)
{
    $request->validate([
        'user_id' => [
            'required',
            'exists:users,id',
            new EqualityValidationRule(
                User::class,
                'company_code',
                Company::class,
                'code',
                'company_id'
            ),
        ],
        'company_id' => 'required|exists:companies,id',
    ]);

    // Assignment logic
}
```

### Example 6: Validating Nested Data Structure

[](#example-6-validating-nested-data-structure)

```
use Illuminate\Http\Request;
use DenizGolbas\LaravelEqualityValidation\EqualityValidationRule;
use App\Models\Order;
use App\Models\Shipment;

public function createShipment(Request $request)
{
    $request->validate([
        'order.order_id' => [
            'required',
            'exists:orders,id',
            new EqualityValidationRule(
                Order::class,
                'tracking_code',
                Shipment::class,
                'order_tracking_code',
                'shipment.shipment_id'
            ),
        ],
        'shipment.shipment_id' => 'required|exists:shipments,id',
    ]);

    // Create shipment
}
```

### Example 7: Using Helper Method (Alternative Syntax)

[](#example-7-using-helper-method-alternative-syntax)

```
use Illuminate\Http\Request;
use DenizGolbas\LaravelEqualityValidation\EqualityValidation;
use App\Models\Order;
use App\Models\Invoice;

public function store(Request $request)
{
    $request->validate([
        'order_id' => [
            'required',
            'exists:orders,id',
            EqualityValidation::rule(
                Order::class,
                'code',
                Invoice::class,
                'code',
                'invoice_id'
            ),
        ],
        'invoice_id' => 'required|exists:invoices,id',
    ]);
}
```

### Parameters

[](#parameters)

The `EqualityValidationRule` constructor accepts the following parameters:

1. **`$referenceModel`** (string): The fully qualified class name of the reference model
2. **`$referenceColumn`** (string): The column name in the reference model to compare
3. **`$targetModel`** (string): The fully qualified class name of the target model
4. **`$targetColumn`** (string): The column name in the target model to compare
5. **`$targetAttribute`** (string): The attribute name in the request that contains the target model ID
6. **`$sameLine`** (bool, optional): Whether to use the same line/level for finding the target attribute. Defaults to `true`

### Same Line Parameter

[](#same-line-parameter)

When `$sameLine` is `true` (default), the rule will look for the target attribute at the same nesting level as the reference attribute. For example:

```
// With sameLine = true (default)
[
    'items' => [
        ['order_id' => 1, 'invoice_id' => 2]
    ]
]
// Will look for 'items.*.invoice_id' when validating 'items.*.order_id'
```

When `$sameLine` is `false`, it will use the base attribute name:

```
// With sameLine = false
[
    'order_id' => 1,
    'invoice_id' => 2
]
// Will look for 'invoice_id' when validating 'order_id'
```

### Example 8: Real-World E-Commerce Scenario

[](#example-8-real-world-e-commerce-scenario)

```
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use DenizGolbas\LaravelEqualityValidation\EqualityValidationRule;
use App\Models\Order;
use App\Models\Payment;

class ProcessPaymentRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'order_id' => [
                'required',
                'exists:orders,id',
                new EqualityValidationRule(
                    Order::class,
                    'currency',
                    Payment::class,
                    'currency',
                    'payment_id'
                ),
            ],
            'payment_id' => 'required|exists:payments,id',
            'amount' => 'required|numeric|min:0',
        ];
    }

    public function messages(): array
    {
        return [
            'order_id.required' => 'Sipariş seçilmelidir.',
            'payment_id.required' => 'Ödeme bilgisi seçilmelidir.',
        ];
    }
}
```

### Example 9: Validating with Different Column Names

[](#example-9-validating-with-different-column-names)

```
use Illuminate\Http\Request;
use DenizGolbas\LaravelEqualityValidation\EqualityValidationRule;
use App\Models\Customer;
use App\Models\Account;

public function linkAccount(Request $request)
{
    $request->validate([
        'customer_id' => [
            'required',
            'exists:customers,id',
            new EqualityValidationRule(
                Customer::class,
                'region',           // Customer has 'region' column
                Account::class,
                'customer_region',  // Account has 'customer_region' column
                'account_id'
            ),
        ],
        'account_id' => 'required|exists:accounts,id',
    ]);
}
```

Translation
-----------

[](#translation)

The package includes English and Turkish translations. You can publish the language files to customize the error messages:

```
php artisan vendor:publish --tag=equality-validation-lang
```

This will publish the language files to `lang/vendor/equality-validation/{locale}/validation.php`.

After publishing, you can customize the error messages in the published files.

The default error message is:

**English:**

> The :reference\_column of :reference\_model does not match the :target\_column of :target\_model.

**Turkish:**

> :reference\_model'in :reference\_column değeri, :target\_model'in :target\_column değeri ile eşleşmiyor.

If you want to use the translations in your application's main language files instead, you can copy the validation key to your `lang/{locale}/validation.php` file under the `custom` key.

Testing
-------

[](#testing)

```
composer test
```

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE) for more information.

Author
------

[](#author)

Deniz Golbas -

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance76

Regular maintenance activity

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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

Unknown

Total

1

Last Release

129d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/52836cdadce7cb1e93e7c4c4e14fe6b64325485a6cfac5b371db871564c7c913?d=identicon)[denizgolbas](/maintainers/denizgolbas)

---

Top Contributors

[![denizgolbas](https://avatars.githubusercontent.com/u/27892099?v=4)](https://github.com/denizgolbas "denizgolbas (9 commits)")

---

Tags

laravelvalidationmodeleloquentequalityrulerelationshipvalidation rule

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/denizgolbas-laravel-equality-validation/health.svg)

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

###  Alternatives

[watson/validating

Eloquent model validating trait.

9723.3M47](/packages/watson-validating)[dyrynda/laravel-model-uuid

This package allows you to easily work with UUIDs in your Laravel models.

4802.8M8](/packages/dyrynda-laravel-model-uuid)[wendelladriel/laravel-lift

Take your Eloquent Models to the next level

70046.8k](/packages/wendelladriel-laravel-lift)[esensi/model

The base model traits of Esensi

20266.5k1](/packages/esensi-model)[korridor/laravel-model-validation-rules

A laravel validation rule that uses eloquent to validate if a model exists

29188.9k](/packages/korridor-laravel-model-validation-rules)[reedware/laravel-relation-joins

Adds the ability to join on a relationship by name.

2121.2M13](/packages/reedware-laravel-relation-joins)

PHPackages © 2026

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