DEV Community

Cover image for Referenceable: Generate Unique Laravel Model References the
Mohamed Said
Mohamed Said

Posted on

Referenceable: Generate Unique Laravel Model References the

In many web applications, generating unique reference numbers for models is a common requirement.
Whether you're building:

  • an e-commerce platform that needs order numbers,
  • an invoicing system requiring invoice references, or
  • any application that needs trackable identifiers,

managing reference number generation can quickly become complex.

Referenceable is a Laravel package by Mohamed Said that simplifies this challenge.
It enables the generation of customizable model reference numbers with flexible formats and powerful configuration options.


✨ Main Features

  • Multiple Generation Strategies
    Random, sequential, and template-based reference generation.

  • Highly Configurable
    Define prefixes, suffixes, separators, and more.

  • Template System
    Use placeholders like {YEAR}, {MONTH}, {SEQ}, {RANDOM} for complex formats.

  • Sequential Numbering
    Auto-incrementing sequences with reset options (daily, monthly, yearly).

  • Validation & Verification
    Built-in reference validation and uniqueness checking.

  • Collision Handling
    Automatic collision detection and resolution.

  • Multi-Tenancy Support
    Tenant-aware reference generation.

  • Artisan Commands
    Comprehensive CLI tools for management and maintenance.

  • Performance Optimized
    Caching, batch processing, and database transactions.


🚀 Example Usage

1️⃣ Migration

Create a migration with a reference_number column:

Schema::create('status_letters', function (Blueprint $table) {
    $table->id();
    $table->string('reference_number')->unique()->index();
    // other columns...
    $table->timestamps();
});
Enter fullscreen mode Exit fullscreen mode

2️⃣ Model Configuration

Use the HasReference trait and configure the reference strategy:

use MohamedSaid\Referenceable\Traits\HasReference;

class StatusLetter extends Model
{
    use HasReference;

    protected $referenceColumn = 'reference_number';
    protected $referenceStrategy = 'template';
    protected $referenceTemplate = [
        'format' => '{PREFIX}-{YEAR}{MONTH}{SEQ}',
        'sequence_length' => 4,
    ];
    protected $referencePrefix = 'STL';
    // Generates: STL-2025090001, STL-2025090002...
}
Enter fullscreen mode Exit fullscreen mode

🔀 Other Strategies

Random Strategy:

protected $referenceStrategy = 'random';
protected $referencePrefix = 'STL';
protected $referenceLength = 6;
protected $referenceCase = 'upper';
// Generates: STL-A12BC3
Enter fullscreen mode Exit fullscreen mode

Sequential Strategy:

protected $referenceStrategy = 'sequential';
protected $referencePrefix = 'STL';
protected $referenceSequential = [
    'start' => 1000,
    'min_digits' => 4,
    'reset_frequency' => 'monthly', // never, daily, monthly, yearly
];
// Generates: STL-001000, STL-001001, STL-001002...
Enter fullscreen mode Exit fullscreen mode

Tip: You can also configure references globally in config/referenceable.php instead of per model.


🛠 Useful Methods & Scopes

// Manually generate without saving
$reference = $statusLetter->generateReference();

// Check if a model has a reference
if ($statusLetter->hasReference()) {
    echo "Reference Number: " . $statusLetter->reference;
}

// Find a record by reference number
$statusLetter = StatusLetter::findByReference('STL-2025090001');

// Query references starting with a prefix
$lettersThisMonth = StatusLetter::referenceStartsWith('STL-202509')->get();
Enter fullscreen mode Exit fullscreen mode

⚡ Installation

Install via Composer and run the install command:

composer require eg-mohamed/referenceable
php artisan referenceable:install
Enter fullscreen mode Exit fullscreen mode

View the source code on GitHub: github.com/EG-Mohamed/Referenceable

Top comments (0)