Laravel Unique is a package created by Will Vincent that provides a trait for Laravel Eloquent models to ensure a field remains unique within specified constraints. It offers flexible suffix formats or custom value generators, ideal for scenarios like unique names, slugs, or identifiers.
Main Features
- Enforces uniqueness at the application level before saving.
- Supports custom suffix formats (e.g., ({n}) or -{n}).
- Allows custom value generators for advanced uniqueness logic.
- Configurable via a config file or model properties.
- Handles constraints (e.g., uniqueness within a specific scope).
Examples
use WillVincent\LaravelUnique\HasUniqueNames; class Team extends Model{ use HasUniqueNames; // Optional: Override default settings protected $uniqueField = 'team_name'; // Field to keep unique (default: 'name') protected $constraintFields = ['team_id']; // Scope of uniqueness (default: []) protected $uniqueSuffixFormat = '-{n}'; // Suffix format (default: ' ({n})')}
If our team_name
is "LNFC" and our team_id
is 1, then our output would be:
Output: "LNFC" (if unique)Output: "LNFC-1" (if "LNFC" already exists)Output: "LNFC-2" (if "LNFC" and "LNFC-1" already exists)
You can also create a custom generator by adding a method to your Model:
protected $uniqueValueGenerator = 'generateUniqueTeamName'; public function generateUniqueTeamName(string $base, array $constraints, ?int $attempt): string{ return $base . '-' . \Str::random(5);}
Output: "LNFC-L2avJ" (random 5-character suffix)
Install the package via Composer:
composer require willvincent/laravel-unique
If you need to customize the defaults you can publish the configuration file (optional):
php artisan vendor:publish --tag="laravel-unique-config"
Note: This package ensures uniqueness at the application level. For data integrity, particularly in high-concurrency scenarios, it is advisable to add database-level unique constraints (such as unique indexes) in conjunction with this trait.
Learn more about this package and view the source code on GitHub.